如何执行相关的顺序调用并返回带有所有响应的数组?

时间:2019-07-30 06:53:38

标签: rxjs redux-observable

我有一个Redux可观察的史诗,它对API进行轮询,并且我试图执行三个相关的顺序HTTP请求,并将所有响应收集到一个数组中。

在这种情况下,将不会执行

toArray(),因为concatMap()尚未完成。我试图将调用移到mergeMap()内并在那里收集数组,但是只有最后一个调用在数组中。

timer(0, POLLING_INTERVAL).pipe(
        concatMap(() => from(fetchApi(url1))),
        concatMap(response => {
          const url2 = 'URL based on first response';

          return from(fetchApi(url2));
        }),
        concatMap(response => {
          const url3 = 'URL based on second response';

          return from(fetchApi(url3));
        }),
        toArray(), // expected [{response1}, {response2}, {response3}]
        map(data => ({
          type: ActionTypes.FETCH_SUCCESS,
          payload: { data },
        })),
        catchError(error =>
          of({
            type: ActionTypes.FETCH_FAILED,
            payload: { error },
          }),
        ),
        takeUntil(
          action$.pipe(
            ofType(ActionTypes.CANCEL_POLLING),
          ),
        ),
      );

1 个答案:

答案 0 :(得分:1)

这取决于您想做什么。 toArray()不会为您提供帮助,因为timer从未完成,并且toArray()仅在其源代码完成时发出。

也许您正在寻找这样的东西:

timer(0, POLLING_INTERVAL).pipe(
  concatMap(() => from(fetchApi(url1)).pipe(
    concatMap(response1 => {
      const url2 = 'URL based on first response';
      return forkJoin([of(response1), fetchApi(url2)]);
    }),
    concatMap(([response1, response2]) => {
      const url3 = 'URL based on second response';
      return forkJoin([of(response1), of(response2), fetchApi(url3)]);
    }),
  )),
  map(data => ({
    type: ActionTypes.FETCH_SUCCESS,
    payload: { data },
  })),
  ...