Действие отправки в конце Epi c с помощью redux-observables - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующий epi c в Redux Observables, и я хотел бы отправить действие другого типа (с другими редукторами), которое ApplicantAction, потому что мне нужны данные, переданные в response, как я могу сделать это?

const updateApplicantEpic: Epic<ApplicantAction, ApplicantAction, State> = action$ =>
  action$.pipe(
    filter(isOfType(EApplicantAction.UpdateApplicant)),
    mergeMap(action =>
      from(
        createAxiosInstance().put(`/applicant/edit/${action.applicantId}`, action.applicant),
      ).pipe(
        map(({ status }) => updatedApplicant(status, action.applicant)),
        startWith(updatingApplicant()),
        catchError(({ response }) => of(updatingApplicantFailed(response.status))),
      ),
    ),
  );

Я хотел бы вызвать действие под названием setNotification() со следующими данными:

{
   id: action.notificationId,
   status: response.status
   title: response.data.title,
   message: response.data.messages?.join('\n'),
   open: false
}

И мое второе действие выглядит следующим образом

const setNotificationEpic: Epic<NotificationAction, NotificationAction, State> = action$ =>
  action$.pipe(
    filter(isOfType(ENotificationAction.SetNotification)),
    map(action => setNotificationSuccess(action.notification)),
  );

1 Ответ

1 голос
/ 12 августа 2020

Есть несколько способов отправить второе действие, и особенности будут зависеть от ваших требований. Оператор mergeMap - это простой способ отправить несколько действий в ответ на событие. Вот простая адаптация вашего примера epi c:

const updateApplicantEpic: Epic<ApplicantAction, ApplicantAction, State> = action$ =>
  action$.pipe(
    filter(isOfType(EApplicantAction.UpdateApplicant)),
    mergeMap(action =>
      from(
        createAxiosInstance().put(`/applicant/edit/${action.applicantId}`, action.applicant),
      ).pipe(
        mergeMap((response) => of(
          updatedApplicant(response.status, action.applicant),
          setNotification(response),
        )),
        startWith(updatingApplicant()),
        catchError(({ response }) => of(updatingApplicantFailed(response.status))),
      ),
    ),
  );

Я предполагаю, что у вас есть функция создания действия setNotification, которая принимает ответ ax ios и возвращает действие. Подпись TypeScript может выглядеть примерно так:

setNotification(response: Response): NotificationAction
...