如何在Redux Observable中调度一个操作,等待1秒,然后再调度两个操作?
我如何在一部史诗中做到以下几点如何在Redux Observable中调度一个操作,等待1秒,然后再调度两个操作?,redux,rxjs,redux-observable,Redux,Rxjs,Redux Observable,我如何在一部史诗中做到以下几点 发送pauseGame() 等一秒钟 派遣2个行动 以下命令分派最后两个操作,但不分派pauseGame() pauseGame没有分派的原因是因为您没有分派它。您正在呼叫动作创建者,然后立即将可观察状态更改为lastmovesuctive 相反,您需要的是拆分管道并将它们合并回一个管道。我知道这令人困惑,但这就是Redux Observable目前的工作方式。如果您希望以不同的方式在任何时间点发送,请查看我的文章: 当出现移动类型时,切换到新的可观察对象。该可
pauseGame
没有分派的原因是因为您没有分派它。您正在呼叫动作创建者,然后立即将可观察状态更改为lastmovesuctive
相反,您需要的是拆分管道并将它们合并回一个管道。我知道这令人困惑,但这就是Redux Observable目前的工作方式。如果您希望以不同的方式在任何时间点发送,请查看我的文章:
当出现移动
类型时,切换到新的可观察对象。该可观察对象是两个新可观察对象的合并:一个立即发送pauseGame
,另一个检查最后一次移动是否成功,如果成功,则等待一秒钟并发送另外两个操作
const-moveEpic:RootEpic=(action$,state$)=>(
动作$.pipe(
过滤器(isActionOf(move)),
开关映射(()=>(
合并(
of(pauseGame()),
of(state$.value.ruleRow.lastMoveSuccessful).pipe(
过滤器(布尔),
延迟(1000),
concatMap(()=>[
removeBoardObject(
状态$.value.ruleRow.totalMoveHistory[
状态$.value.ruleRow.totalMoveHistory.length-1
].拖
),
resumeGame(),
]),
)
)
)),
);
)
作为旁注,我不知道您为什么创建自己的isActionOf
函数,但通常您应该能够将该行改为of type(move)
Evert Bouw利用startWith
和endWith
提供了一个更简单的建议。您将丢失管道中的顺序,但不必拆分:
const-moveEpic:RootEpic=(action$,state$)=>(
动作$.pipe(
过滤器(isActionOf(move)),
开关映射(()=>(
of(state$.value.ruleRow.lastMoveSuccessful).pipe(
过滤器(布尔),
延迟(1000),
地图(()=>(
removeBoardObject(
状态$.value.ruleRow.totalMoveHistory[
状态$.value.ruleRow.totalMoveHistory.length-1
].拖
)),
startWith(pauseGame()),
endWith(resumeGame()),
)
)
)),
);
)
请记住,如果您需要知道
endWith
中的state$
的值,您应该使用finalize
。它采用函数而不是值。定义“关闭但不工作”。会发生什么?您遇到了什么错误?pauseGame不分派,但switchMap中的最后两个操作会分派。它跳过pauseGame()。要回答为什么我使用isActionOf而不是ofType,isActionOf来自typesafe操作库。它的作用与ofType完全相同,但有助于在管道中键入下一项。
const moveEpic: RootEpic = (action$, state$) =>
action$.pipe(
filter(isActionOf(move)),
map(() => pauseGame()),
filter(() => state$.value.ruleRow.lastMoveSuccessful),
delay(1000),
switchMap(() => [
removeBoardObject(
state$.value.ruleRow.totalMoveHistory[state$.value.ruleRow.totalMoveHistory.length - 1]
.dragged,
),
resumeGame(),
]),
);