首页 > 解决方案 > 如何组合多个 observable、RxJS 的结果?

问题描述

我正在学习 RxJS 并试图用 Promise 替换我之前所做的一些代码,但我正在努力寻找组合 observables 的正确方法。

我有一个调用多个 API 的代码,并且每个 API 调用都执行相同的代码。此外,在 API 调用完成后,我还有一些其他代码应该只执行一次并且只执行一次。我用 Promise 做到了这一点,我做了多个 Promise,对于每个 Promise 我执行相同的代码,然后Promise.all()我只执行其他代码。

所以我尝试用 RxJS 做到这一点:

var apiCallIterator = ["id1", "id2", id3];
var apiCallObservable = from(apiCallIterator)
  .pipe(
    mergeMap(apiCallIterator => {
      return makeAnApiCall();
    })
   );

apiCallObservable.subscribe({
next: value => {
 // do some code for each API call
},
error: () => {
 // api call failed
}
})

这适用于我任务的第一部分,它会在每次 API 调用完成后执行相同的代码。但是在完成所有 API 调用后,我找不到一种方法可以在一个地方获得所有结果。

也许我从一开始就做错了,但这部分似乎对我来说很好。

标签: javascriptrxjs

解决方案


最容易添加toArray()

from(apiCallIterator)
  .pipe(
    mergeMap(val => makeAnApiCall()),
    toArray(), // collect all results
  )
  .subscribe(allResults => ...); // allResults.forEach(...) to iterate all results

你也可以使用forkJoin,但你必须事先准备一个包含所有 Observables 源的数组。但是,这只是您的偏好问题。

https://stackblitz.com/edit/rxjs6-demo-qbvhjh?file=index.ts


推荐阅读