2016-02-23 11 views
21

Ich versuche meine Kenntnisse über Angular2 zu verbessern, indem ich eine Anwendung migriert derzeit in Angular1Angular2 Observable - Wie wird gewartet, bis alle Funktionsaufrufe in einer Schleife beendet sind, bevor Sie fortfahren?

Ein Merkmal insbesondere hat mich ratlos. Ich versuche, ein Feature zu replizieren, in dem eine aufrufende Funktion wartet, fortzufahren, bis die Funktion, die es aufruft, eine Schleife von Versprechen abgeschlossen hat. In Winkel einer sieht im Grunde wie folgt nenne die Funktion I:

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ück und speichert alle diese zurück Versprechungen in einem Array.

Mit Angular1, wenn ich processStuff in einer anderen Funktion anrufe, könnte ich damit rechnen, dass das System wartet, bis processStuff abgeschlossen ist, bevor der Code in den then Block eingegeben wird. IE:

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

Der Anrufer von processStuff wartet auf alle doMoreStuff Anrufungen abzuschließen, bis der Anrufer von processStuff in geht in die dann blockieren.

Ich bin nicht sicher, wie dies mit Angular2 und Observables erreicht werden kann. Ich kann von diesem Posten sehen, die Versprechungen zu imitieren, Observable im Grunde nur dann statt abonnieren verwenden:

Angular 1.x $q to Angular 2.0 beta

Aber wie ich warte für alle Anrufungen in der forEach Schleife abgeschlossen ist, bevor mein System fortfahren kann?

Antwort

50

Ich habe dies mit 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]}); 

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

+1

das Argument für die forkJoin kann ein Array sein? Könnten Sie bitte ein Beispiel zeigen, in dem Sie mit einer for-Schleife iterieren, um dieses "Array" zu füllen. Ich bin mir nicht sicher, ob die Schleife innerhalb oder außerhalb des neuen Observable-Blocks ist und wie man observer.next() verwendet. und observer.complete(); –

+0

Hier finden Sie spezifische Anweisungen zum Importieren: http://StackOverflow.com/Questions/34581471/angular2-http-is-missing-map-Function/34581771#34581771 –

+1

Ja, es kann ein Array sein: https: // github. com/Reaktive-Erweiterungen/RxJS/Blob/Master/doc/Api/Kern/Operatoren/Forkjoin.md – msanford

Verwandte Themen