J'écris une application dans Angular 2 et je veux exécuter plusieurs requêtes http et exécuter une fonction sur les réponses.
Dans Angular 1, j'écrirais quelque chose comme $q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);
Mais Angular 2 renvoie RxJS Observables et, après de nombreuses lectures, je ne comprends toujours pas comment obtenir les réponses de plusieurs requêtes http. Comment cela peut-il être fait?
Comme @Eric Martinez l'a fait remarquer, il y a forkJoin . forkJoin exécute toutes les séquences observables en parallèle et collecte leurs derniers éléments.
Rx.Observable.forkJoin([a,b]).subscribe(t=> {
var firstResult = t[0];
var secondResult = t[1];
});
Je ne suis pas sûr que vous souhaitiez utiliser forkJoin/Zip
, d'autant plus que combineLatest
est plus facile à comprendre et émettra à chaque événement de sous-flux, alors que forkJoin
contient essentiellement des échantillons de chaque sous-flux émis.
Cela pourrait vous venir plus tard lorsque vous souhaitez combiner des observables à éléments multiples ultérieurement.
Une merge
ne fonctionnerait-elle pas? Vous pouvez vous abonner et attacher un gestionnaire au rappel onComplete
.
Je construis d’abord un tableau de mes observables puis utilise statique merge
:
let obs_ary: any = [obs1, obs2, obs3];
Observable.merge(...obs_ary);
J'apprends RxJS et j'essayais de faire la même chose avec RxJS v5
Il semble que nous n’ayons plus forkJoin
sur la v5, alors voici comment j’ai fonctionné (fonctionne avec flatMap
ou mergeMap
, qui sont des alias):
const callOne = value =>
new window.Promise(resolve =>
setTimeout(() => resolve(value + 10), 3000)
);
const callTwo = value =>
new window.Promise(resolve =>
setTimeout(() => resolve(value + 20), 1000)
);
Rx.Observable
.of(2)
.do(() => console.log('querying...'))
.mergeMap(number =>
Rx.Observable.Zip(
Rx.Observable.fromPromise(callOne(number)),
Rx.Observable.fromPromise(callTwo(number))
)
).concatAll()
.subscribe(createSubscriber('promises in parallel'));