更多点击会发生什么

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 运算符中返回原始源来观察可观察对象,这将有效地创建基于该源的新流,即旧流,不过,还是会敲定的。