RxJS:forkJoin mergeMap

Jar*_*ers 1 rxjs

我正在尝试发出多个 http 请求并在一个对象中获取返回的数据。

const pagesToFetch = [2,3]
const request$ = forkJoin(
  from(pagesToFetch)
    .pipe(
      mergeMap(page => this.mockRemoteData(page)),
    )
)
Run Code Online (Sandbox Code Playgroud)

mockRemoteData() 返回一个简单的 Promise。第一个 Observable 发出后(从 pageToFetch 的第一个条目创建一次 request$ 已完成,不包括第二个值。我该如何解决这个问题?

mar*_*tin 6

您可以将每个值转换pagesToFetch为 Observable,然后等待所有值完成:

const observables = pagesToFetch.map(page => this.mockRemoteData(page));

forkJoin(observables)
  .subscribe(...);
Run Code Online (Sandbox Code Playgroud)

或者,如果事情没那么简单,您需要pagesToFetch首先成为一个 Observable 来收集 url,您可以使用以下示例:

from(pagesToFetch)
  .pipe(
    toArray(),
    mergeMap(pages => {
      const observables = pages.map(page => this.mockRemoteData(page));
      return forkJoin(observables);
    }),
  )
  .subscribe(...);
Run Code Online (Sandbox Code Playgroud)