我已经多次阅读了ReactiveX codebase的部分内容,但仍然无法完全理解toSubscribe.ts
中here发生的情况:
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
是用于标识Symbol
和Subscriber
实例的Subject
。在RxJS的版本5中,使用
Symbol.for
声明了此符号-请参见here-这意味着同一符号将在RxJS的不同副本或版本之间共享。并且在副本或版本之间启用了符号互操作-一个副本中的Subscribers
不需要被另一个副本包裹。但是,在版本6中,该符号使用
Symbol
声明-请参见here。这意味着它本质上是私有的,因为RxJS的每个副本或版本都会收到一个唯一的符号,并且不能执行互操作角色。rxSubscriberSymbol
用于Subscriber
和Subject
,但是现在它是一个专用符号,它不再具有目的,在我看来,这是不必要的:不必在
Subscriber
中使用它,因为instanceof Subscriber
检查将标识Subscriber
实例。而且它在
Subject
中的使用是不必要的,因为rxSubscriberSymbol
中的Subject
属性-请参见here-除了将Subject
包裹在Subscriber
中以外,什么也没有做-这就是在toSubscriber
中发生的情况没有检查。关于javascript - 在RxJS中,为什么要检查toSubscriber中的rxSubscriberSymbol?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54487471/