更多点击会发生什么
What happen with further clicks
我有一个会抛出错误的可观察对象,当计数器达到 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-paradigms:每当流中抛出错误时(无论是直接 throw new Error(..)
还是 Observable.throw(...)
),订阅的流都会自动已完成,订阅者已取消订阅。
所以该行为是预期的。
修复您个人情况下的这个问题:如果您不希望流停止并且除非您想手动重新订阅,请不要抛出错误。
补充:catch
-operator 只允许对流中的错误做出反应,独立于任何订阅者 - 尽管流本身仍将最终确定 - catch
这个名字有点像错误印象在这里。 - 您可以 "retry" 通过在 catch
运算符中返回原始源来观察可观察对象,这将有效地创建基于该源的新流,即旧流,不过,还是会敲定的。
我有一个会抛出错误的可观察对象,当计数器达到 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-paradigms:每当流中抛出错误时(无论是直接 throw new Error(..)
还是 Observable.throw(...)
),订阅的流都会自动已完成,订阅者已取消订阅。
所以该行为是预期的。
修复您个人情况下的这个问题:如果您不希望流停止并且除非您想手动重新订阅,请不要抛出错误。
补充:catch
-operator 只允许对流中的错误做出反应,独立于任何订阅者 - 尽管流本身仍将最终确定 - catch
这个名字有点像错误印象在这里。 - 您可以 "retry" 通过在 catch
运算符中返回原始源来观察可观察对象,这将有效地创建基于该源的新流,即旧流,不过,还是会敲定的。