有没有办法在 redux-observable 史诗中调度一个动作?

Is there a way to dispatch an action inside redux-observable epic?

我正在开发一个 react/redux 应用程序来处理事件注册,并且必须开发一个史诗来在不同的事件中注册用户。

目前有一个史诗处理检查可用座位的过程,我需要在 运行 "enrol" 函数之前执行此操作。

所以我尝试实现一个史诗,它会执行以下操作:

 - Upon recieving an enrolInEvent.request it is going to then
 - Dispatch checkAvailableSeats.request action
 - Wait for checkAvailableSeats.success action
 - Run the 'enrol' async function
 - Dispatch checkAvailableSeats.request again
 - When it gets the checkAvailableSeats.success it is then mapped to enrolInEvent.success

这是我构建的代码,但我似乎找不到在 Epic 中间调度 'checkAvailableSeats.request' 的方法。正在发生的事情是 enrolInEvent.request 正在被调度,但是 redux-logger 中没有弹出新的操作。

// tl;dr:
// enrolInEvent.request -> checkAvailableSeats -> enrol -> checkAvailableSeats again -> enrolInEvent.success

export const enrolInEventEpic: EventMetadataEpic =
  (action$, state$, { eventService }) =>
    action$.pipe(
      filter(isActionOf(enrolInEvent.request)),
      map(checkAvailableSeats.request), // I would need to dispatch this
      switchMap(() =>
        action$.pipe(  // Then scan the action observable for a success response
          filter(isActionOf(checkAvailableSeats.success)),
          take(1),
          switchMap(() =>
            from(eventService.enrolInCurrentEvent(
              state$.value.eventForm.eventStatus,
              state$.value.infrastructure.pageId,
            ))
            .pipe(
              map(checkAvailableSeats.request), // And dispatch here again
              switchMap(() =>
                action$.pipe(
                  filter(isActionOf(checkAvailableSeats.success)),
                  take(1),
                  map(checkStatus => enrolInEvent.success(checkStatus.payload)),
                  catchError((message: string) => of(enrolInEvent.failure(message))),
                )
              )
            )
          )
        )
      )
    );

我的印象是映射到史诗中间的一个动作会调度它,但这似乎不是真的。使用 redux-observable 实现我需要的行为的最简单方法是什么?

调度动作的唯一时间是史诗本身 returns 这些动作,因此 map(checkAvailableSeats.request) 不会像您预期的那样工作,除非它是史诗的最后一部分。

我不太确定为什么需要两次 checkAvailableSeats,但我看到的两个选项是:

1) 在 checkAvailableSeats.request 中内联 XHR 逻辑,可能带有 Ajax Observable。这样你就不必派发中间的 Redux 动作

2) 拆分您的史诗 (enrolInEventEpic),以便所有操作都从单独的 epics 中分派,并通过区分操作负载 [=13] 来控制执行两个 request/success 对中的哪一个=]