RxJS:Pipe方法如何使运算符在内部作为参数工作?

时间:2018-02-09 06:47:49

标签: rxjs

我一直在研究pipe方法源代码,我找不到任何关于触发它作为参数的运算符的线索。 根据我在源代码中看到的,首先,pipe方法将operations OperatorFunction类型而不仅仅是运算符作为参数。然后,它调用pipeFromArray函数,将操作传递给它。在pipeFromArray函数中,它使用operations方法迭代reduce。这是一个棘手的部分:我查看了map运算符,例如mapOperation作为参数的操作(在本例中为pipe函数),除了返回一个获得MapOperator的新Observable。我想知道源代码中的哪一点,操作符或操作被触发。 MapOperator确实有call方法,我假设它是触发器,但我看不到任何调用call方法的实现。

1 个答案:

答案 0 :(得分:3)

pipe最终只会在链接运算符后返回一个observable(正如您已经注意到的那样)。一般情况下,观察者只有在实际订阅时才会被“召唤”,因此你的回答在于Observable.ts本身;更具体地说,在subscribe函数中:

subscribe(observerOrNext?: PartialObserver<T> | ((value: T) => void),
          error?: (error: any) => void,
          complete?: () => void): Subscription {

  const { operator } = this;
  const sink = toSubscriber(observerOrNext, error, complete);

  if (operator) {
    operator.call(sink, this.source);
  } else {
    sink.add(this.source ? this._subscribe(sink) : this._trySubscribe(sink));
  }

  return sink;
}