Подтвердить что ты не робот

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

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

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

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), которая также возвращает обещание, и хранит все возвращенные promises в массиве.

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

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

Вызывающий processStuff ожидает завершения всех вызовов doMoreStuff до тех пор, пока вызывающий объект processStuff не войдет в свой блок then.

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

Angular 1.x $q до angular 2.0 beta

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

4b9b3361

Ответ 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