Redux-Saga - 在触发取消操作时取消所有其他传奇

Redux-Saga - cancel all other sagas when cancel action is fired

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

现在是这样组成的:

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

我有 ActionTypes.CANCEL,当它被解雇时,我希望取消任何其他传奇(getOneSagagetTwoSaga),我想管理 yield cancelled()取消 API 个内部调用。

那么,我该如何组合我的所有操作和取消操作。

这是我在 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)));
  }
}

你可以使用race效果:

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

Creates an Effect description that instructs the middleware to run a Race between multiple Effects. When resolving a Race, the middleware automatically cancels all the losing Effects