javascript - 进一步点击会发生什么

标签 javascript rxjs rxjs5

当计数器达到 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/

相关文章:

javascript - 如何模拟 ES6 模块的导入?

javascript - 如何从字符串中提取纬度和经度值?

javascript - 从一系列 promise 中获取值

javascript - 我应该使用 FORM 标签吗?

javascript - 每 5 秒循环执行一个函数,然后在上次执行后重置

angular - RxJS:WebSocket 重连处理

reactive-programming - RX 中没有主题的反馈循环

javascript - 使用rxjs实现指数补偿

angular - 类型 'distinctUntilChanged' 上不存在属性 'Observable<Event>'

javascript - Redux-Observable 中具有依赖关系的多个操作