web-dev-qa-db-ja.com

Angular2 Observable-続行する前にループ内のすべての関数呼び出しが終了するのを待つ方法は?

現在Angular1で書かれたアプリケーションを移行することにより、Angular2の知識を向上させようとしています。

特に1つの機能に困惑しています。呼び出し元の関数が約束のループを完了するまで、呼び出し元の関数が処理を待機する機能を複製しようとしています。 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);
}; 

これには、別の関数(doMoreStuff)を呼び出すforEachループが含まれており、これもプロミスを返し、返されたプロミスをすべて配列に格納します。

Angular1では、別の関数でprocessStuffを呼び出すと、processStuffが完了するまで待ってからthenブロックのコードを入力することができます。 IE:

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

processStuffの呼び出し元は、doMoreStuffの呼び出し元がそのthenブロックに入るまで、すべてのprocessStuff呼び出しが完了するのを待ちます。

私はAngular2とObservablesでこれを達成する方法がわかりません。私はこれらの投稿から、約束を模倣するために、Observablesは基本的にはsubscribeを代わりに使用することを見ることができます:

Angular 1.x $ q to Angular 2.0 beta

しかし、システムを続行する前に、forEachループ内のすべての呼び出しが完了するのをどのように待つのでしょうか?

29

私は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

66
TGH