2016-12-02 7 views
0

Hallo Ich beginne mit RxJS und ich habe eine Lösung für das nächste Problem, aber ich mag es nicht, hoffen, dass Sie eine bessere Lösung bieten kann:RxJS Wie toggle und pause zwischen Observablen?

Stellen haben wir 2-Streams wollen wir wechseln zu:

  • eine Anfrage
  • ein Timeout

Dann wir zwischen ihnen wechseln wollen, aber man wird wieder aufgenommen, wenn andere ein Ereignis hat und diese angehalten wird. Z.B. wir machen eine Anfrage, wenn wir Erfolg haben, wir machen eine Zeitüberschreitung, wenn wir fertig sind, machen wir eine Anfrage, wenn wir fertig sind, machen wir eine Zeitüberschreitung und so weiter.

In meiner Lösung simulierte ich die Anfrage mit einem Intervall, und ich „pausable()“, aber ich weiß nicht, wie die Skalierbarkeit dieser Lösung:

import Rx from 'rx'; 

const requestPauser = new Rx.Subject(); 
const requestStream = Rx.Observable.interval(500).pausable(requestPauser); 
const intervalPauser = new Rx.Subject(); 
const intervalStream = Rx.Observable.interval(500).pausable(intervalPauser); 


requestStream.subscribe(function(){ 
    requestStream.pause(); 
    intervalStream.resume(); 
    console.log("request"); 
}); 
intervalStream.subscribe(function(){ 
    requestStream.resume(); 
    intervalStream.pause(); 
    console.log("interval"); 
}); 

requestStream.resume(); 

Wie RxJS Experten dieses Problem lösen würden ?

Antwort

1

Sie haben die Antwort in der Frage. Ich schlage vor, switchMap http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-switchMap

requestStream.switchMap(()=>Rx.Observable.interval(500)); 

Ich denke nicht, ein pausable wirklich erforderlich ist.

UPDATE

Da OP beobachtbaren erfordert Sekunde nach dem ersten zu beginnen, sollten ConcatMap verwendet werden.

+0

danke Suraj, mit diesem habe ich eine Verzögerung, aber wie kann ich dann eine Schleife erstellen, die beide wiederholt werden? const responseStream = Rx.Observable.fromPromise ($ .getJSON ('https://api.github.com/users')); responseStream.subscribe (() => {console.log (1);}); responseStream.switchMap (() => Rx.Observable.just (2) .delay (500)). Subscribe (() => { console.log (2); }); –

+0

Entschuldigung, das war falsch, weil das zweite Abonnement von Anfang an ausgeführt wird und es ausgeführt werden muss, sobald das erste fertig ist. –

+0

ok..my bad .. hätte genauer hinschauen sollen .. –

Verwandte Themen