2016-02-24 15 views
39

In Angular 1.x a volte devo fare più richieste http e fare qualcosa con tutte le risposte. Vorrei lanciare tutte le promesse in un array e chiamare Promise.all(promises).then(function (results) {...}).Promise.all comportamento con RxJS Observables?

Le 2 migliori pratiche angolari sembrano indicare l'utilizzo di Observable di RxJS in sostituzione delle promesse nelle richieste http. Se ho due o più oggetti osservabili diversi creati da richieste http, è un equivalente a Promise.all()?

risposta

37

L'alternativa più semplice per emulare Promise.all consiste nell'utilizzare l'operatore forkJoin (inizia tutti osservabili in parallelo e uniscono i loro ultimi elementi):

Un po 'fuori portata, ma in caso aiuta, in materia di promesse concatenamento, è possibile utilizzare un semplice flatMap: Cf. RxJS Promise Composition (passing data)

+1

se ho 2 chiamate uno promessa di ritorno e un altro ritorno osservabile can i utente forkjoin? o promise.all()? o nessuno, devo lasciare che le 2 funzioni restituiscano lo stesso tipo promesse o osservabili? –

3

forkJoin funziona bene, ma preferirei combineLatest poiché non è necessario preoccuparsi di prendere l'ultimo valore di osservabili. In questo modo, puoi semplicemente essere aggiornato ogni volta che uno di essi emette anche un nuovo valore (ad esempio, recuperi su un intervallo o qualcosa del genere).

+0

Questo non soddisfa i miei bisogni attuali ma lo userò sicuramente presto. –

+1

Questo non ha lo stesso comportamento di Promise.all(), ma è simile a Promise.any() – Purrell

+0

se ho 2 chiamate una promessa di reso e un altro ritorno osservabile posso usare forkjoin? o promise.all()? o nessuno, devo lasciare che le 2 funzioni restituiscano lo stesso tipo promesse o osservabili? –

2

Su reactivex.ioforkJoin in realtà punta a Zip, che ha fatto il lavoro per me:

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);