Я немного запутался, пытаясь заставить rx js играть хорошо здесь.
Я могу отлично выполнять одиночные запросы API, например,
const documentFetchEpic: Epic<TRootAction, TRootAction, TRootState> = (action$, store) =>
action$.pipe(
filter(isActionOf(documentActions.fetch)),
withLatestFrom(store),
switchMap(([action, state]) =>
merge(
of(sharedActions.setLoading(true)),
ApiUtils.documents.fetch(action.payload).pipe(
mergeMap(response => [
sharedActions.setLoading(false),
documentActions.fetchSuccess({
name: action.payload,
data: response,
}),
]),
catchError(err => of(sharedActions.setError(err), sharedActions.setLoading(false)))
)
)
)
);
работает как положено.
Проблема в том, что я пытаюсь выбрать несколько элементов одновременно через forkJoin
. Я не совсем уверен, что с этим делать.
const DocumentTypes = ['a', 'b', 'c'];
const fetchAll = () =>
forkJoin<{ name: TDocumentTypes; data: DocumentRes }>(
...DocumentTypes.map(documentType =>
ApiUtils.documents.fetch(documentType).pipe(map(response => ({ name: documentType, data: response.data })))
)
)
const documentFetchAllEpic: Epic<TApiActions, TApiActions, TApiState> = (action$, store) =>
action$.pipe(
filter(isActionOf(documentActions.fetchAll)),
withLatestFrom(store),
switchMap(([action, state]) =>
merge(
of(sharedActions.setLoading(true)),
fetchAll().pipe(
mergeMap(responses => [
sharedActions.setLoading(false),
responses.map(response => {
documentActions.fetchSuccess({
name: response.name,
data: response.data,
});
}),
]),
catchError(err => of(sharedActions.setError(err), sharedActions.setLoading(false)))
)
)
)
);
Это не скомпилируется со следующей ошибкой:
Type 'void[]' is missing the following properties from type 'PayloadAction<"@@api/shared/SET_LOADING", Error>': type, payloadts(2322)
Я не очень хорошо понимаю rx . js так что я предполагаю, что моя проблема лежит там. Я хочу обернуть все наблюдаемые объекта documentFetch в forkJoin
, а затем обработать его так же, как и раньше.