Dans Angular 1.x, j'aurais parfois besoin de faire plusieurs http
demandes et de faire quelque chose avec toutes les réponses. Je jetterais toutes les promesses dans un tableau et appellerais Promise.all(promises).then(function (results) {...})
.
Les meilleures pratiques Angular 2 semblent indiquer l'utilisation de RxJS Observable
en remplacement des promesses dans les http
demandes. Si j'ai deux ou plusieurs observables différents créés à partir de requêtes http, existe-t-il un équivalent à Promise.all()
?
la source
Mise à jour de mai 2019 avec RxJs v6
A trouvé les autres réponses utiles, et a souhaité donner un exemple de réponse proposée par Arnaud sur l'
zip
usage.Voici un extrait de code montrant l'équivalence entre
Promise.all
et le rxjszip
(notez aussi, dans rxjs6 comment zip est maintenant importé en utilisant "rxjs" et non en tant qu'opérateur).import { zip } from "rxjs"; const the_weather = new Promise(resolve => { setTimeout(() => { resolve({ temp: 29, conditions: "Sunny with Clouds" }); }, 2000); }); const the_tweets = new Promise(resolve => { setTimeout(() => { resolve(["I like cake", "BBQ is good too!"]); }, 500); }); // Using RxJs let source$ = zip(the_weather, the_tweets); source$.subscribe(([weatherInfo, tweetInfo]) => console.log(weatherInfo, tweetInfo) ); // Using ES6 Promises Promise.all([the_weather, the_tweets]).then(responses => { const [weatherInfo, tweetInfo] = responses; console.log(weatherInfo, tweetInfo); });
La sortie des deux est la même. L'exécution de ce qui précède donne:
{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ] { temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]
la source
forkJoin fonctionne bien aussi, mais je préférerais combineLatest car vous n'avez pas à vous soucier qu'il prenne la dernière valeur d'observables. De cette façon, vous pouvez simplement être mis à jour chaque fois que l'un d'eux émet également une nouvelle valeur (par exemple, vous récupérez un intervalle ou quelque chose).
la source
Sur reactivex.io forkJoin pointe en fait vers Zip , qui a fait le travail pour moi:
let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);
la source
-_-