例如下面这段代码
fromEvent(document, 'click').pipe(
map(i => {
console.log('click')
throw new Error('error')
})
).subscribe({
next: console.log,
complete: () => console.log('complete'),
error: (err) => console.log(err)
})
我以为的输出:点一下输出 click 和 error ,再点还输出 click 和 error
实际上的输出:点一下输出 click 和 error ,再点就没反应了
就算用 catchError 也一样会被关闭
事件倒还好,加个 retry 就行了,of 之类还得用 map 包起来
例如想输出 1 3 不能这么写
of(1, 2, 3).pipe(
map(i => {
if (i === 2) {
throw new Error('error')
}
return i;
}),
catchError(err => EMPTY)
).subscribe({
next: console.log,
complete: () => console.log('complete'),
error: (err) => console.log(err)
})
要这么写用 map 包起来
of(1, 2, 3).pipe(
switchMap(i => {
return of(i).pipe(
map(i => {
if (i === 2) {
throw new Error('error')
}
return i;
}),
catchError(i => EMPTY)
)
})
).subscribe({
next: console.log,
complete: () => console.log('complete'),
error: (err) => console.log(err)
})
为啥要这么设计?出来个错误把整个管子都给扬了。
RxJS 实际的业务都是怎么写的,都是加 retry 或者拿 map 包起来吗?总不能在所有 map 里写 try catch 吧。