Redux saga:如何从另一个没有启动它的任务中取消一个任务?

Redux saga: how to cancel one task from another that didn't initiate it?

我正在阅读 this article 关于在 Redux saga 中取消任务的内容。基本上他们的例子是这样的:

function* main() {
  yield call(task1);
  yield cancel(task1);
}

function* task1() {
  <...>
}

这里main可以取消task1因为它调用了。在我的代码中,我 运行 函数是这样的:

function* task1() {
  <...>
}

function* task2() {
  yield cancel(task1);
}

function* main() {
  takeLatest(actionCreator1, task1);
  takeLatest(actionCreator2, task2);
}

task2 中取消 task1 不起作用,大概是因为 task2 没有调用 task1。有谁知道我该如何解决这个问题?

解决方案可能是让 main 自己执行类似于 takeLatest 的操作,但使用额外的逻辑来取消其他任务。

如果您只希望 action2 执行额外的取消操作,那么它将看起来像这样:

function* main() {
  let firstTask;
  let secondTask;
  while (true) {
    const action = yield take([actionCreator1, actionCreator2]);
    if (firstTask) {
      // Always cancel task 1, whether we got action 1 or action 2
      yield cancel(firstTask);
    }
    if (action.type === "the type of action 1") {
      firstTask = yield fork(task1, action);
    } else {
      if (secondTask) {
        // Only cancel task 2 if we got action 2
        yield cancel(secondTask);
      }
      secondTask = yield fork(task2, action);
    }
  }
}

如果你想让两个动作同时取消两个任务,就简单一点:

function* main() {
  let task;
  while (true) {
    const action = yield take([actionCreator1, actionCreator2]);
    if (task) {
      yield cancel(task);
    }
    if (action.type === "the type of action 1") {
      task = yield fork(task1, action);
    } else {
      task = yield fork(task2, action);
    }
  }
}