Come fare la sequenza di catene in rxjs

Mi piacerebbe qualcosa come:

this._myService.doSomething().subscribe(result => { doSomething() }); .then( () => dosthelse() ) .then( () => dosanotherthing() ) 

Quindi vorrei incatenarmi. Così come nella promise. Come lo farei in Rxjs?

 this._myService.getLoginScreen().subscribe( result => { window.location.href = MyService.LOGIN_URL; /// I would like to wait for the site to load and alert something from the url, when I do it here it alerts the old one }); .then (alert(anotherService.partOfTheUrl()) getLoginScreen() { return this.http.get(myService.LOGIN_URL) .flatMap(result => this.changeBrowserUrl()) .subscribe( result => //i want to do sth when the page is loaded//); } changeBrowserUrl(): Observable { return Observable.create( observer => { window.location.href = myService.LOGIN_URL; observer.next(); }); } 

L’equivalente di then per osservabili sarebbe flatMap . Puoi vedere alcuni esempi di utilizzo qui:

  • RxJS Promise Composition (dati trasmessi)
  • Perché dobbiamo usare flatMap?
  • La sequenza RxJS equivale a promise.then ()?

Per il tuo esempio, potresti fare qualcosa come:

 this._myService.doSomething() .flatMap(function(x){return functionReturningObservableOrPromise(x)}) .flatMap(...ad infinitum) .subscribe(...final processing) 

Presta attenzione ai tipi di ciò che restituiscono le tue funzioni, in quanto a catena osservabili con flatMap dovrai restituire una promise o un osservabile.

Se dosthelse o dosanotherthing restituisce un valore grezzo, l’operatore da utilizzare è map . Se è osservabile, l’operatore è flatMap (o equivalente).

Se vuoi fare qualcosa in modo imperativo. Intendo al di fuori della catena di elaborazione asincrona, potresti sfruttare l’operatore do .

Supponendo che dosthelse dosanotherthing un object osservabile e dosanotherthing un object grezzo, il tuo codice sarebbe:

 this._myService.doSomething() .do(result => { doSomething(); }) .flatMap( () => dosthelse() ) .map( () => dosanotherthing() ); 

Si noti che se si restituisce il ritorno del metodo subcribe, corrisponderà a un object di sottoscrizione e non a un osservabile. Un object di abbonamento è principalmente per poter annullare l’osservabile e non può prendere parte alla catena di elaborazione asincrona.

In effetti, la maggior parte delle volte, ti iscrivi alla fine della catena.

Quindi vorrei refactoring il tuo codice in questo modo:

 this._myService.getLoginScreen().subscribe( result => { window.location.href = MyService.LOGIN_URL; /// I would like to wait for the site to load and alert something from the url, when I do it here it alerts the old one alert(anotherService.partOfTheUrl() }); getLoginScreen() { return this.http.get(myService.LOGIN_URL) .flatMap(result => this.changeBrowserUrl()) .do( result => //i want to do sth when the page is loaded//); } changeBrowserUrl(): Observable { return Observable.create( observer => { window.location.href = myService.LOGIN_URL; observer.next(); }); } 

Possiamo utilizzare il metodo toPromise che consente di convertire una sequenza osservabile in Promessa.