RxJs:takeUntil的奇怪行为?

时间:2017-03-23 13:04:33

标签: rxjs rxjs5

这里没什么太严重的,只是好奇 我想为某些事情做一个例子并提出这个代码:

const { Observable, Subject } = Rx

const timeout$ = new Subject()

const obs$ = Observable
  .of(1)
  .takeUntil(timeout$)
  .delay(2000)
  .subscribe(x => console.log(x))

timeout$.next()
timeout$.complete()

我认为此代码会显示console.log,但确实如此。

有人可以解释我为什么吗? 这是一个错误,还是我对takeUntil的错误理解?

这是一个演示https://plnkr.co/edit/wpKztBabnBeIuNZS28wu?p=info

的Plunkr

1 个答案:

答案 0 :(得分:3)

请注意,如果您切换takeUntil()delay()的顺序,它将无法按预期发出:

Observable
  .of(1)
  .delay(2000)
  .takeUntil(timeout$)
  .subscribe(x => console.log(x));

您看到的内容是因为delay()takeWhile()发送complete通知之前安排了排放。
现在在RxJS 5.2.0中,takeWhile()运算符并不强制取消订阅其来源,这是此处的问题。因此,当takeWhile()通知timeout$时,它仍会订阅其来源Observable,因此delay()的预定排放量不会被处置。

请注意,处理来自通知的排放时,没有this.unsubscribe()来电:https://github.com/ReactiveX/rxjs/blob/master/src/operator/takeUntil.ts#L61

其他具有相同行为的运营商。例如first()takeWhile()

另一方面,例如take()运算符取消订阅:

https://github.com/ReactiveX/rxjs/blob/master/src/operator/take.ts#L80

事实上已经报告了这种行为,现在正在讨论这是否是一个错误: