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

时间:2019-06-17 07:31:51

标签: 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();

我想念什么?

1 个答案:

答案 0 :(得分:1)

很好的问题,现在让我们深入探讨。

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

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运算符将返回完整源,这将触发后续订阅者内部的完整方法(在我们的示例中,在自定义test运算符内部以及{{1}内部})之后,subscribe将不会发出任何其他内容,因为它已经完成。

您可以查看源=> take(),有关更多信息,请随时询问是否存在一些模糊的部分。