有没有办法在 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 对中的哪一个=]
我正在开发一个 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 对中的哪一个=]