2017-03-23 10 views
1

ここではあまり深刻なことは何もなく、興味があります。
私は何かのために例を作りたかったと、このコードを思い付いた:RxJs:takeUntilの奇妙な動作ですか?

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については、これはバグですか、それとも悪いことですか?

は、ここでは、takeUntil()delay()の順序を切り替える場合に予想されるとして、それが放出されないことをhttps://plnkr.co/edit/wpKztBabnBeIuNZS28wu?p=info

答えて

2

お知らせをデモするPlunkrです:

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()

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

この動作は、実際に報告され、このかどうか、今議論されているバグがあるかどうか::例えば一方

take()オペレータは退会ん

+1

その優れた答えをありがとう:)!例、修正する方法、参照...これは素晴らしいことです!ありがとう! – Maxime