例如下面这段代码
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 吧。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.