我有一个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),
),
),
);
答案 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 },
})),
...