Chaining Observables in RxJS

Sto imparando RxJS e Angular 2. Diciamo che ho una catena di promesse con più chiamate di funzioni asincrone che dipendono dal risultato precedente che assomiglia a:

var promiseChain = new Promise((resolve, reject) => { setTimeout(() => { resolve(1); }, 1000); }).then((result) => { console.log(result); return new Promise((resolve, reject) => { setTimeout(() => { resolve(result + 2); }, 1000); }); }).then((result) => { console.log(result); return new Promise((resolve, reject) => { setTimeout(() => { resolve(result + 3); }, 1000); }); }); promiseChain.then((finalResult) => { console.log(finalResult); }); 

I miei tentativi di fare lo stesso utilizzando esclusivamente RxJS senza l’uso di promesse hanno prodotto quanto segue:

 var observableChain = Observable.create((observer) => { setTimeout(() => { observer.next(1); observer.complete(); }, 1000); }).flatMap((result) => { console.log(result); return Observable.create((observer) => { setTimeout(() => { observer.next(result + 2); observer.complete() }, 1000); }); }).flatMap((result) => { console.log(result); return Observable.create((observer) => { setTimeout(() => { observer.next(result + 3); observer.complete() }, 1000); }); }); observableChain.subscribe((finalResult) => { console.log(finalResult); }); 

Produce lo stesso risultato della catena di promesse. Le mie domande sono

  1. Lo sto facendo bene? Ci sono dei miglioramenti relativi a RxJS che posso apportare al codice precedente

  2. Come faccio a eseguire questa catena osservabile ripetutamente? Ad esempio, l’aggiunta di un altro abbonamento alla fine ne produce altri 6, anche se mi aspetto che stampi 1, 3 e 6.

    observableChain.subscribe ((finalResult) => {console.log (finalResult);});

    observableChain.subscribe ((finalResult) => {console.log (finalResult);});

    1 3 6 6

Per quanto riguarda la composizione delle promesse rispetto a Rxjs, poiché si tratta di una domanda frequente, è ansible fare riferimento a un numero di domande precedenti su SO, tra cui:

  • Come fare la sequenza di catene in rxjs
  • RxJS Promise Composition (dati trasmessi)
  • La sequenza RxJS equivale a promise.then ()?

Fondamentalmente, flatMap è l’equivalente di Promise.then .

Per la seconda domanda, vuoi riprodurre i valori già emessi o vuoi elaborare nuovi valori non appena arrivano? Nel primo caso, controlla l’operatore publishReplay . Nel secondo caso, l’abbonamento standard è sufficiente. Tuttavia potrebbe essere necessario essere consapevoli del freddo. contro dicotomia a caldo a seconda della fonte (vedi osservabili Hot e Cold: ci sono operatori “caldi” e “a freddo” per una spiegazione illustrata del concetto)