2017-08-15 35 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. 等待所有观察结束并创建一个包含所有结果值的数组