2016-04-25 8 views
3

RxJSでは、ストリームが変更されてもサブスクリプションがストリームに残るようにしたい。 bar$流れを変えながら、私は動作をテストするために間隔ストリームを使用サブスクリプションを維持しながら観測可能なストリームを変更する

//Works because foo$ is unchanged 
let foo$ = Rx.Observable.interval(1000); 
foo$.subscribe(x => console.log(`foo$: ${x}`)); 

//Doesn't work because bar$ is changed 
let bar$ = Rx.Observable.never(); 
bar$.subscribe(x => console.log(`bar$: ${x}`)) 
bar$ = Rx.Observable.interval(1000); 

jsbin Live Demo

の下にはどのようにしてサブスクリプションを持続していますか? bar $を変更した後、サブスクリプションを処分して別のサブスクリプションを設定していますか?

+0

なぜあなたはそれをテストしていませんか?それは簡単です。私はbarFuncがいつものように値を受け取ることを期待します。あなたは 'foo $'を購読しませんが、 'foo $'を参照する(購読の瞬間に)。 'foo $'が後で変更された場合、サブスクリプションに何も変更してはいけません。しかし、私はそれをテストし、結果を教えてくれた。 – user3743222

+0

私はコードを更新し、jsbinでテストしました。運がない。他のアイデア? – ckwong

+0

... Rx.Observable.neverは誰も値を出すことのない観測者です...あなたはテストの悪い例を夢見ることはできませんでした。 – user3743222

答えて

3

Rxの一般的なパターンは、状態の変化を値のストリーム(つまり観測可能なもの)で置き換えることです。ここでは、bar $を再割り当てするのではなく、bar $をObservable<Observable<T>>(つまり、タイプTの値のストリームのストリーム)としてモデル化する必要があります。その後、値のストリーム(この場合はswitchを使用)に「フラットアウト」することができます。例えば

const bar$ = new Rx.Subject(); 
bar$.switch().subscribe(x => console.log(`bar$: ${x}`)); 
bar$.onNext(Rx.Observable.fromArray([1,2,3])); 
bar$.onNext(Rx.Observable.interval(1000).take(3)); 

https://jsbin.com/firoso/edit?js,console,output

関連する問題