Javascript 进一步点击会发生什么

Javascript 进一步点击会发生什么,javascript,rxjs,rxjs5,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("co

当计数器达到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的基本范例之一:每当在流中抛出错误时,不管它是直接抛出新错误。。或者可以观察到。扔。。。订阅流将自动完成,订阅方将取消订阅

因此,这种行为是意料之中的

在您个人的情况下解决这个问题:如果您不希望流停止,请不要抛出错误,除非您想手动重新订阅


另外:just允许对流中的错误做出反应,独立于任何订户-流本身仍将最终确定-名称捕获在这里给人一种错误的印象。-您可以通过在catch操作符中返回原始源来重试observable,这将有效地基于该源创建一个新流,但是,旧流仍将被最终确定。

作为一般个人注意事项:不要为语义问题抛出异常,例如在某些数据达到语义限制的情况下。我不知道您的代码,但在我看来-错误/异常是针对技术问题引发的,例如,当所需参数丢失或接收的数据没有预期的结构时。-也许你可以描述你想要的场景-我相信rxjs可以优雅地处理这个问题,而不会抛出错误。我不明白的是,当我在catch方法中返回如下源:.catchoError,oSource$=>oSource$时,订阅者将不会被取消订阅,为什么?catch操作符只是一个方便的操作符,它允许对流中的错误做出反应,独立于任何订阅者-流仍然会被终结,但我不明白,为什么当我返回oSource$时,它会像往常一样订阅,即使流已经终结。它不会进入我的大脑。绝对正确-但是:由于错误,source1将始终被取消订阅,但是您可以通过执行…=>oSource$-因此rxjs将自动在该源上创建一个新订阅,但从技术上讲,它是一个新流-仅在同一源上