web-dev-qa-db-fra.com

Promise .all () avec RxJS

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?

16
benshope

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];
});
30
pixelbits

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.

7
kakigoori

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);
2
flyer88

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'));
1
rafaelbiten