не может использовать forkJoin с наблюдаемым редуксом - PullRequest
0 голосов
/ 08 февраля 2020

Я немного запутался, пытаясь заставить 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, а затем обработать его так же, как и раньше.

1 Ответ

0 голосов
/ 08 февраля 2020

Ах. Я не понял, MergeMap. Проблема заключалась в том, что мой responses.map(...) возвращал Void[]

, поэтому исправленный блок

          mergeMap(responses => [
            sharedActions.setLoading(false),
            ...responses.map(response =>
              documentActions.fetchSuccess({
                name: response.name,
                data: response.data,
              })
            ),
          ]),
...