2016-04-25 11 views
3

In RxJS möchte ich, dass das Abonnement im Stream beibehalten wird, auch wenn der Stream geändert wird. Im Folgenden werde ich ein Intervall Strom das VerhaltenÄndern des beobachtbaren Streams beim Beibehalten des Abonnements

//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

Wie bestehen ich das Abonnement zu testen, während bar$ Strom zu ändern? Muss ich das Abonnement ablegen und ein anderes Abonnement einrichten, nachdem ich bar $ geändert habe?

+0

warum Sie es nicht testen? Es ist leicht zu machen. Ich würde erwarten, dass barFunc seine Werte wie gewohnt erhält. Sie abonnieren nicht "foo $", sondern "foo $' references "(im Moment des Abonnements). Wenn sich 'foo $' später ändert, sollte es nichts an der Subskription ändern. Aber wie gesagt, teste es und erzähle uns das Ergebnis. – user3743222

+0

Ich habe den Code aktualisiert und auf Jsbin getestet. Kein Glück. Irgendwelche anderen Ideen? – ckwong

+0

... Rx.Observable.Never ist eine beobachtbare, die nie einen Wert ausgibt ... Sie hätten nicht von einem schlechteren Beispiel für einen Test träumen können. – user3743222

Antwort

3

Das allgemeine Muster in Rx besteht darin, die Zustandsänderung durch einen Strom von Werten zu ersetzen (d. H. Beobachtbar). Anstatt $ bar neu zuzuweisen, sollte bar $ als Observable<Observable<T>> modelliert werden (dh ein Strom von Datenströmen vom Typ T). Es kann dann in einen Strom von Werten "verflacht" werden (in diesem Fall mit switch).

Zum Beispiel:

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

Verwandte Themen