2017-08-15 42 views
0

什麼是轉換數組並調用幾個可觀察方法的最佳方法。地圖方法內部的Async Observable方法

我所尋找的是這種類型的東西的工作:

resultArray = someArray.map(item => { 
     oneObs.subscribe(result1 => { 
      item.result1 = result1 
     }); 
     secondObs.subscribe(result2 => { 
      item.result2 = result2 
     }); 
    }); 

什麼是最好的辦法嗎?我想出了一個解決方法,使用這種forEach循環:

someArray.forEach(item => { 
     Observable.forkJoin([oneObs, secondObs]).subscribe(
     (results: [Result1Type, Result2Type]) => { 
      item.result1 = results[0]; 
      item.result2 = results[1]; 
      resultArray.push(item); 
     }); 
    }); 

任何幫助表示讚賞。

回答

2

您試圖混合同步和異步代碼,這可能會導致一些奇怪的行爲。我的建議是將數組轉換爲可觀察到的(使陣列異步)獲得結果,然後完成的結果再次轉換到一個數組:

Observable.from(someArray) // 1 
    .mergeMap(item => Observable.forkJoin(oneObs, twoObs) 
      .map(results => { 
       item.result1 = results[0]; 
       item.result2 = results[1]; 
       return item; 
      })) 
    .toArray() // 2 
    .subscribe(arr => resultArray = arr); 
  1. 創建一個可觀察到的基於陣列上
  2. 等待所有觀察結束並創建一個包含所有結果值的數組