【问题标题】:Redux-Saga - cancel all other sagas when cancel action is firedRedux-Saga - 触发取消操作时取消所有其他 saga
【发布时间】:2020-12-18 18:25:44
【问题描述】:

在我的项目中,我有一个根 saga,它监视多个操作并进行一些 API 调用。 在某些情况下,我想取消那些 sagas 和 API 调用。

现在它是这样组成的:

export default function*() {
  yield all([
    takeLatest(ActionTypes.GET_ACTION_ONE, getOneSaga),
    takeLatest(ActionTypes.GET_ACTION_TWO, getTwoSaga),
  ]);
}

我有 ActionTypes.CANCEL,当它被触发时,我希望取消任何其他 saga(getOneSagagetTwoSaga),并且我想管理 yield cancelled() 以取消其中的 API 调用。

那么,我如何组合我的所有动作并取消动作。

【问题讨论】:

    标签: redux-saga


    【解决方案1】:

    你可以使用race 效果:

    export default function* () {
      yield race([
        take(ActionTypes.CANCEL),
        all([
          takeLatest(ActionTypes.GET_ACTION_ONE, getOneSaga),
          takeLatest(ActionTypes.GET_ACTION_TWO, getTwoSaga),
        ]),
      ]);
    }
    

    创建一个 Effect 描述,指示中间件在多个 Effect 之间运行 Race。在解决 Race 时,中间件会自动取消所有失败的效果

    【讨论】:

      【解决方案2】:

      这是我在this issue 的帮助下找到的解决方案

      export default function*() {
        while (true) {
          const allTasks = yield all([
            takeLatest(ActionTypes.GET_ACTION_ONE, getOneSaga),
            takeLatest(ActionTypes.GET_ACTION_TWO, getTwoSaga),
          ]);
          yield take(ActionTypes.CANCEL);
          yield all(allTasks.map((task: Task) => cancel(task)));
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多