RxJS Sample - 为什么不发出源的最后一个事件

时间:2017-06-24 02:39:56

标签: rxjs

从示例运算符(Rxjs-sample)的RxJS文档中,它说:

  

每当通知程序Observable发出一个值或完成时,sample会查看源Observable并发出自上一次采样以来最近发出的任何值,除非源自上一次采样后没有发出任何内容。

但是,以下代码似乎表现不正常:

Rx.Observable.zip(
  Rx.Observable.from(['Joe', 'Frank', 'Bob']),
  Rx.Observable.interval(2000)
)
.sample(Rx.Observable.interval(2500))
.subscribe(console.log);

输出如下:

[ 'Joe', 0 ]
[ 'Frank', 1 ]

为什么输出不包括[' Bob',2]?

1 个答案:

答案 0 :(得分:2)

这是预期的行为。 notifier Observable完成时,source Observable无法完成。随时可以完成;在source Observable之前或之后。这段文档:

  

每当通知程序Observable完成时

仅指notifier Observable在source Observable之前完成的情况。你的notifier Observable:

Rx.Observable.interval(2500)

永远不会完成,因此只会考虑source Observable仍处于活动状态时发出的值。绘制粗糙的大理石图:

Source:    -----O-----O-----O|
Notifier:  ------O------O------O--...

只有notifier Observable上的前两个弹珠才会使sample发出值。当source Observable死亡时,整个链都死了,notifier Observable不再重要。事实上,我敢打赌Rxjs足够聪明,可以取消订阅,以免造成内存泄漏。