我已经多次阅读了ReactiveX codebase的部分内容,但仍然无法完全理解toSubscribe.tshere发生的情况:

if (nextOrObserver) {
  if (nextOrObserver instanceof Subscriber) {
    return (<Subscriber<T>> nextOrObserver);
  }

  if (nextOrObserver[rxSubscriberSymbol]) {
    return nextOrObserver[rxSubscriberSymbol]();
  }
}


我知道的

我知道Observable.subscribe接受传入的观察者(可以采用不同的形式),并通过toSubscribe.ts将观察者转换为Subscriber对象。新的Subscriber对象将在SafeSubscriber属性中具有一个Subscriber.destination实例。

Subscriber.ts类中的This segment也与以下问题有关:

[rxSubscriberSymbol]() { return this; }


在上面的代码中,rxSubscriberSymbol Symbol属性返回类实例本身。

我的问题

我得到toSubscriber必须检查观察者是否已经是Subscriber。好吧,我不太确定何时使用已经是toSubscribe的观察者调用Subscriber,但是我想有时候会发生这种情况。

为什么既要检查观察者是否是Subscriber的实例又要检查rxSubscriberSymbol Symbol属性是否存在?据我所知,如果实例是Subscriber的实例,则它始终具有rxSubscriberSymbol Symbol属性,反之亦然。

最佳答案

当您通过管道运算符组成一个可观察对象时,如下所示:

const source = of(42);
const composed = source.pipe(
    map(value => (6 * 9) - value)
);
composed.subscribe(value => console.log(value));


每个操作员都会有一个可观察的介绍。

在这里,呼叫者正在订阅映射的可观察对象,而映射的可观察对象订阅了源。

调用者订阅时,仅传递next处理程序。也就是说,调用者不会传递Subscriber实例-因此需要toSubscriber来创建一个实例。但是,当映射的可观察对象订阅源时,它通过传递map运算符的MapSubscriber来进行订阅。您可以看到对subscribe的调用是here

MapSubscriber扩展了Subscriber,因此不需要toSubscriber创建另一个。它可以只返回收到的MapSubscriber

rxSubscriberSymbol是用于标识SymbolSubscriber实例的Subject

在RxJS的版本5中,使用Symbol.for声明了此符号-请参见here-这意味着同一符号将在RxJS的不同副本或版本之间共享。并且在副本或版本之间启用了符号互操作-一个副本中的Subscribers不需要被另一个副本包裹。

但是,在版本6中,该符号使用Symbol声明-请参见here。这意味着它本质上是私有的,因为RxJS的每个副本或版本都会收到一个唯一的符号,并且不能执行互操作角色。

rxSubscriberSymbol用于SubscriberSubject,但是现在它是一个专用符号,它不再具有目的,在我看来,这是不必要的:


不必在Subscriber中使用它,因为instanceof Subscriber检查将标识Subscriber实例。
而且它在Subject中的使用是不必要的,因为rxSubscriberSymbol中的Subject属性-请参见here-除了将Subject包裹在Subscriber中以外,什么也没有做-这就是在toSubscriber中发生的情况没有检查。

关于javascript - 在RxJS中,为什么要检查toSubscriber中的rxSubscriberSymbol?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54487471/

10-11 22:12