javascript - RxJS 自定义运算符不调用完成

标签 javascript rxjs

我有以下自定义运算符:

export function test() {
  return function(source) {
    return new Observable(observer => {

      return source.subscribe({
        next(value) {
          observer.next(value);
        },
        error(error) {
          observer.error(error);
        },
        complete() {
          console.log('completed')
          observer.complete();
        }
      })
    });
  }
}

问题是,当我订阅一个完成的可观察对象时,我没有得到完整的回调,即我没有看到完成的日志。

interval(1000).pipe(
  test(),
  take(2)
).subscribe();

我错过了什么?

最佳答案

好问题,现在让我们深入解释一下。

首先,让我们看看解决方案

function test(limitter) {
  return function(source) {
    return new Observable(observer => {
      return source.subscribe({
        next(value) {
          observer.next(value);
        },
        error(error) {
          observer.error(error);
        },
        complete() {
          console.log("completed action");
          observer.complete("completed value");
        }
      });
    });
  };
}

interval(1000)
  .pipe(
    take(2),
    test()
  )
  .subscribe(
    x => {
      console.log("result: ", x);
    },
    err => {
      console.log(err);
    },
    end => {
      console.log("Observable has been completed");
    }
  );

那么有什么区别呢,在这个片段中,take 运算符先于自定义的 test() 运算符,这意味着每当我们达到所需的计数时(在我们的在 2 的情况下,take 运算符将返回 completed source,这将在后续订阅者中触发我们的 complete 方法(在我们的示例中,在自定义中test 运算符以及 subscribe 内)之后 source 将不会发出任何其他内容,因为它已经完成。

可以查看源码=> take() , 如果有一些模糊的部分,请随时询问更多信息。

关于javascript - RxJS 自定义运算符不调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56626679/

相关文章:

javascript - 如何更改Google可视化图表中单元格的颜色

javascript - 如何在 Chrome 或 Firefox 开发者工具控制台中使用 RxJS Observable?

javascript - 如何从 Javascript 调用 Objective-C 方法并将数据发送回 iOS 中的 Javascript?

javascript - ember.js 如何插入新记录?

javascript - Facebook - fb graph api js sdk 对用户 ID 给出错误的响应

angular - 每次服务器响应+延迟后轮询服务器

javascript - Observables - 防止数组的 onCompleted

javascript - 在 RxJS 中组合不同类型的 Observable,但只发出来自其中之一的值

javascript - 为什么水龙头运算符(operator)会影响水流?

javascript - Spring WebSocket 返回未记录的 403