This article describes the refCount operator并解释说,为了防止取消对可观察到的A的订阅,我们必须在可观察到的源中添加delay(0)
,以便从“ rxjs / Observable”中导入{可观察到};
const source = Observable.defer(() => Observable.of(
Math.floor(Math.random() * 100)
)).delay(0);
0
总是足够吗?换句话说,传递零是否保证通知将延迟到所有m.subscribe()
语句都已运行,假设它们都在multicast
语句之后立即运行,如下所示:
const m = source.multicast(() => new Subject<number>()).refCount();
m.subscribe(observer("a"));
m.subscribe(observer("b"));
在上述情况下,我们仅订阅观察者a
和b
。如果我们在多播语句将运行delay(0)
之后订阅了一百万个观察者,还保证他们在第一个源通知发生之前都将被订阅吗?
答案 0 :(得分:1)
要了解此问题,您必须知道:
如果您不添加delay(0)
,则此Observable将是同步的:
const source = Observable.defer(() => Observable.of(
Math.floor(Math.random() * 100)
)).delay(0);
第一次订阅发生(订阅是同步代码)时,Observable立即发出,因为它也是同步的。但是,如果您添加delay(0)
(类似于setTimeout
),则Javascript将等到所有同步代码(在这种情况下为所有source.subscribe()
)执行之后。之后,它将运行异步delay(0)
)。
在这里:
const m = source.multicast(() => new Subject<number>()).refCount();
m.subscribe(observer("a"));
m.subscribe(observer("b"));
您有source
个Observable,它的发射传递到delay(0)
之后变成异步的。届时,同步代码将继续(您所有其他source.subscribe()
调用),完成后,将发出同步delay(0)
。
在这种情况下,即使执行数百万个source.subscribe()
调用也很安全。
p.s。
multicast(() => new Subject<number>()).refCount()
与share()
完全相同-它使用 Subject 工厂进行多播,并使用{{1 }}。