如何在Redux Observable中调度一个操作,等待1秒,然后再调度两个操作?

如何在Redux Observable中调度一个操作,等待1秒,然后再调度两个操作?,redux,rxjs,redux-observable,Redux,Rxjs,Redux Observable,我如何在一部史诗中做到以下几点 发送pauseGame() 等一秒钟 派遣2个行动 以下命令分派最后两个操作,但不分派pauseGame() pauseGame没有分派的原因是因为您没有分派它。您正在呼叫动作创建者,然后立即将可观察状态更改为lastmovesuctive 相反,您需要的是拆分管道并将它们合并回一个管道。我知道这令人困惑,但这就是Redux Observable目前的工作方式。如果您希望以不同的方式在任何时间点发送,请查看我的文章: 当出现移动类型时,切换到新的可观察对象。该可

我如何在一部史诗中做到以下几点

  • 发送pauseGame()
  • 等一秒钟
  • 派遣2个行动
  • 以下命令分派最后两个操作,但不分派pauseGame()


    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(),
        ]),
      );