2016-05-13 14 views
1

配列の各要素を処理し、要素ごとにHTTP呼び出しを行い、すべての呼び出しが完了したときにUI呼び出しを更新する必要があります。現在、私は次のコード処理中にオブジェクトにアクセスするオブジェクトの配列

for (var singleData of this.someData) { 
     this._Service.call(singleData.someData).subscribe(
      data=> { 
       this.successGroups.push(singleData); 
       this.checkState(); 
      }, 
      error=> { 
       this.failureGroups.push(singleData); 
       this.checkState(); 
      } 
     ) 
    } 

this._Serviceを持ってAngular2 HTTP呼び出しを行うと、観察を返す単純なサービスです。以下のような目的は以下のとおりです。

  1. が成功として成功マーク場合はリスト
  2. の各項目の呼び出しを行い、失敗
  3. 更新UIなどの障害は、一度すべてのコールは(成功/失敗は重要ではない。)仕上げ

上記のコードの問題は、 "singleData"が更新されるため、誤った値がプッシュされることです。例えば、リストの最初のオブジェクトに対してsubscriberが実行されるまでに、 "singleData"はリストの10番目の項目を指し、10番目の項目は最初の項目の代わりになります。

+0

ハッキングは、singleDataオブジェクトをサービス呼び出しに渡し、これを応答に追加することです。このアプローチが好きではありません。 –

+0

ObservablesやAngularなどとは関係ありません。これは、古典的なfunction-inside-for-loop closureの問題です。 forを試してみましょう。 –

答えて

2

あなたは近いですが、私は少し異なるアプローチを示唆している - の線に沿って何か:一般的に

// Observable.from() takes an array-like value and emits for each element 
let requests$ = Observable.from(this.someData) 
          .flatMap(singleData => this._Service.call(singleData.someData); 

requests$.subscribe(
    data => { 
    this.successGroups.push(singleData); 
    this.checkState(); 
    }, 
    error => { 
    this.failureGroups.push(singleData); 
    this.checkState(); 
    } 
); 

は、これらの事をモデリングにおける私の目標は、特に(観測との数を最小限にすることです)私が作成しているサブスクリプション。現在のアプローチでは、nnsomeData配列の長さです)を作成しますが、この方法ではそれぞれ1つだけ作成します。

関連する問題