2016-05-13 78 views
1

我需要處理數組中的每個元素,爲每個元素進行HTTP調用,並且需要跟蹤每個調用的HTTP調用狀態並在所有事情完成時更新UI。目前我有以下代碼訪問HTTP內部的對象Observable處理數組時對象數組

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調用並返回observable。目標如下:

  1. 撥打電話的列表中的每一項
  2. 如果成功標誌是成功,失敗視爲失敗
  3. 更新UI一旦所有呼叫完成(成功/失敗是無關緊要的。)

上述代碼的問題在於,由於「singleData」被更新,所以推送的值不正確。例如,當列表中第一個對象被執行的時候,「singleData」指向列表的第10個項目,而第10個項目取而代之。

+0

一個破解就是將singleData對象傳入服務調用中,並將其附加到響應中。不喜歡這種方法壽。 –

+0

這與Observables或Angular或其他任何東西無關。這是經典的函數內循環封閉問題。嘗試「爲(讓)」。 – 2016-05-16 03:37:05

回答

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

一般情況下,我在模擬這些東西目標是儘量減少觀測量和數量(尤其是)我創建的訂閱。在目前的方法中,您正在創建各自的n(其中n是您的someData數組的長度),而使用此方法時,您只創建每個數組的1個。