wake-up-neo.com

Angular2 Observable - Wie warte ich, bis alle Funktionsaufrufe in einer Schleife beendet sind, bevor ich fortfahre?

Ich versuche, meine Kenntnisse in Angular2 zu verbessern, indem ich eine Anwendung migriere, die derzeit in Angular1 geschrieben ist

Eine Besonderheit hat mich verblüfft. Ich versuche, eine Funktion zu replizieren, bei der eine aufrufende Funktion darauf wartet, fortgesetzt zu werden, bis die aufgerufene Funktion eine Reihe von Versprechungen abgeschlossen hat. In angular one sieht die Funktion, die ich aufrufe, im Grunde so aus:

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);
}; 

Es enthält eine forEach-Schleife, die eine andere Funktion (doMoreStuff) aufruft, die auch ein Versprechen zurückgibt, und speichert alle zurückgegebenen Versprechen in einem Array.

Wenn ich mit Angular1 processStuff in einer anderen Funktion aufrufe, kann ich mich darauf verlassen, dass das System wartet, bis processStuff abgeschlossen ist, bevor der Code im then-Block eingegeben wird. IE:

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

Der Aufrufer von processStuff wartet, bis alle doMoreStuff Aufrufe abgeschlossen sind, bis der Aufrufer von processStuff in seinen then-Block eintritt.

Ich bin nicht sicher, wie ich dies mit Angular2 und Observables erreichen soll. Ich kann aus diesen Posts ersehen, dass Observables, um Versprechungen nachzuahmen, im Grunde genommen nur subscribe verwenden, anstatt dann:

Angular 1.x $ q to Angular 2.0 beta

Aber wie warte ich, bis alle Aufrufe in der forEach -Schleife abgeschlossen sind, bevor mein System fortfahren kann?

29

Ich habe das mit forkJoin gemacht

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

Weitere Informationen hier: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

66
TGH