当计数器达到 5 时,我有一个会抛出错误的可观察对象:
let counter = 0;
const source2 = Rx.Observable.of(true)
.map(() => [1,2,3,4,5]);
source2
.subscribe((x) => console.log(x),
(err) => console.log(err),
() => console.log("complete 2!!"));
const source1 = Rx.Observable.fromEvent(document, 'click')
.do(() => console.log("Document clicked!"))
.do(() => counter++)
.map(() => {
if(counter > 5) {
counter = 0;
throw new Error("Counter is too big!");
}
return true;
})
.catch((oError, oSource$) => source2)
source1
.subscribe((x) => console.log(x),
(err) => console.log(err),
() => console.log("complete!!"));
当错误发生时,它将切换到source2
,如上面的代码所示。
当我进一步点击文档时,没有任何反应,为什么?进一步点击会发生什么?
最佳答案
这是基本的 rxjs 范式之一:每当流中抛出错误时(无论是直接的 throw new Error(..)
还是 Observable.throw (...)
)订阅的流将自动最终确定并且订阅者将取消订阅。
因此该行为是预期的。
要在您的个人情况下解决此问题:如果您不希望流媒体停止并且除非您想手动重新订阅,则不要抛出错误。
添加:catch
-operator只允许对流中的错误使用react,独立于任何订阅者 - 尽管流本身仍将最终确定 - 名称 catch
在这里给人一种错误的印象。 - 您可以通过在 catch 运算符中返回原始源来“重试”可观察对象,这将有效地基于该源(即旧流)创建一个新流,仍待最终确定。
关于javascript - 进一步点击会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273859/