Subject
Subject是一个Observable,因为它有subscribe方法;Subject又是一个Observer,因为它有next方法。它维护一个observers列表,当运行subject.subscribe(observerX)的时候,这个observerX就被加到列表里,unsubscribe时从列表中删掉。Subject像是一个proxy,外部调用subject.next(value)时,这个value会被forEach给Subject的observers。
Scheduler 我就说不清楚了,一是因为我在实践中没用过,另外我只认识 Javascript。我觉得要明白 Scheduler,在 Javascript 的 context 下面,首先要明白 event loop。
文档中也提到过,Subject 也是 Observable 对象,同时它还是一个 observer,最后是事件转发(proxy)器。具体解释一下:
一、Subject 有 subscribe 方法,所以它是一个 Observable:
var subject = new Rx.Subject();
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(1);
subject.next(2);
所以 Subject 可以理解为 Producer 函数为空的 Observable 。
二、Subject 可以作为别的 Observable 的 subscribe 方法的参数,所以它也是一个 observer,因为 subscribe 接收的就是一个 observer,就像这样:
source.subscribe(subject)
并且它具有 next 方法,更印证了它是一个 observer :
subject.next(2);
三、在所谓的 multicasted(多播)场景中,Subject 不仅是一个 observer ,它还负责把它订阅收到的值转发给它的子 observers,这样一来这些 observers 就相当于订阅了同一个 Subscription 对象,而不是执行多次 Producer 函数、产生多个不同的 Subscription。在这种场景下,Subject 就是一个事件的 proxy。
如果希望给 Subject 对象设置一个默认值,那就用 BehaviorSubject,如果希望每个历史的值都触发一遍 subscribe 回调函数,那就用 ReplaySubject,都是 Subject 的变种。
Scheduler
目前只理解到,它同样是一个复合的概念。可以用它来决定上下文,从而影响代码的执行机制。在 JS 环境中,可能会比多线程的环境稍微简单一点。

