这里没什么太严重的,只是好奇 我想为某些事情做一个例子并提出这个代码:
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
的错误理解?
答案 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
事实上已经报告了这种行为,现在正在讨论这是否是一个错误: