web-dev-qa-db-fra.com

Angular2 Observable - comment attendre que tous les appels de fonction d'une boucle se terminent avant de poursuivre?

J'essaie d'améliorer ma connaissance de Angular2 en migrant une application actuellement écrite en Angular1

Une caractéristique en particulier m'a laissé perplexe. J'essaie de reproduire une fonction dans laquelle une fonction appelante attend jusqu'à ce que la fonction qu'elle appelle ait terminé une boucle de promesses. Dans angular une des fonctions que j'appelle ressemble en gros à ceci:

this.processStuff = function( inputarray, parentnodeid ) {
    var promises = [];
    var _self = this;
    angular.forEach( inputarray , function( nodeid ) {

        switch ( parentnodeid )
        {
            case ‘AAA’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘BBB’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘CCC’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            default    : var component = null;
        }
        promises.Push( component );
    });
    return $q.all(promises);
}; 

Il contient une boucle forEach qui appelle une autre fonction (doMoreStuff) qui renvoie également une promesse et stocke toutes ces promesses dans un tableau.

Avec Angular1, lorsque j'appelle processStuff dans une autre fonction, je pouvais compter sur le système en attendant que ProcessStuff soit terminé avant d'entrer dans le code du bloc en question. C'EST À DIRE:

service.processStuff( arraying, parentidarg )
       .then(function( data ) {
              ... 

L'appelant de processStuff attend que tous les invocations de doMoreStuff se terminent jusqu'à ce que l'appelant de processStuff entre dans son bloc d'alors.

Je ne sais pas comment y parvenir avec Angular2 et Observables. Je peux voir dans ces articles que, pour imiter les promesses, Observables utilise simplement abonnement au lieu de:

angulaire 1.x $ q à Angular 2.0 bêta

Mais comment puis-je attendre que tous les appels de la boucle forEach soient terminés avant que mon système puisse continuer?

29
Benjamin McFerren

Je fais ça avec forkJoin

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';

Observable.forkJoin(
  this.http.get('./friends.json').map((res: Response) => res.json()),
  this.http.get('./customer.json').map((res: Response) => res.json())
)
.subscribe(res => this.combined = {friends: res[0].friends, customer: res[1]});

Quelques informations supplémentaires ici: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

66
TGH