将Promise.all转换为Observable

时间:2016-10-04 18:44:13

标签: javascript asynchronous rxjs observable

我需要进行几个相互依赖的异步调用。我最初编写代码并使用Promise.all分步制作async。我遍历了我的数据并创建了一个async方法,以便将所有需要的操作放入一个数组中以传递到Promise.all()。这工作正常,但我怎么能使用Observables做同样的事情。我已经读过forkJoin相当于Promise.all,但是我怎样才能遍历数据并包装我的async函数,然后在移动到下一个{{}}之前执行它{1}}?

flatMap

1 个答案:

答案 0 :(得分:0)

我认为你想要的是这样的

Rx.Observable.of({ itemIds: [1, 2, 3, 4, 5 ]})
  .mergeMap(response => {
    const promises = response.itemIds
      .map(id => {
        return new Promise((resolve, reject) => {
          // Wait for some random time, then resolve the promise.
          const timeout = Math.floor(Math.random() * 5000);
          setTimeout(() => {
            console.log(`Finished promise ${id}`); // debug only
            resolve({id, resolved: true}) 
          }, timeout);
        });
      });
    // Wait until all Promises have been resolved, then return all
    // of them in a single and ordered array.
    return Rx.Observable.forkJoin(promises);
  })
  .subscribe(x => console.log(x));

Working code on jsbin

请注意,promises以任意顺序解析,但以正确的顺序返回。 jsbin示例中的注释代码还显示每个promise可以单独解析并合并回原始流,以防promises的顺序不重要。