Angular2 Observable-как дождаться завершения всех вызовов функций в цикле, прежде чем продолжить?

Я пытаюсь улучшить свои знания Angular2 путем миграции приложения, написанного в настоящее время на Angular1

одна особенность, в частности, поставила меня в тупик. Я пытаюсь реплицировать функцию, где вызывающая функция ждет продолжения, пока вызываемая функция не завершит цикл обещаний. В angular one функция, которую я вызываю, выглядит в основном так:

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

он содержит цикл forEach, который вызывает другую функцию (doMoreStuff) , которая также возвращает обещание и сохраняет все возвращенные обещания в массиве.

С Angular1, когда я вызываю processStuff в другой функции, я могу рассчитывать на систему, ожидающую завершения processStuff, прежде чем вводить код в блок then. Т. е.:

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

абонент processStuff ждет всех doMoreStuff вызовы для завершения до вызывающего processStuff входит в ее блок.

Я не уверен, как достичь этого с Angular2 и Заметный. Из этих сообщений я вижу, что для имитации обещаний наблюдаемые в основном просто используют subscribe вместо then:

Угловое 1.x $q в Angular 2.0 beta

но как мне ждать всех призывов в forEach цикл для завершения, прежде чем моя система сможет продолжить?

1 ответов


Я делал это с 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]});

дополнительная информация здесь:http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http