Redux saga:タスクを開始しなかった別のタスクからキャンセルする方法は?

Aug 21 2020

のタスクのキャンセルに関するこの記事を読んでい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);
}

おそらくを呼び出さなかったため、キャンセルtask1task2機能しません。誰かが私がこれにアプローチする方法を知っていますか?task2task1

回答

1 NicholasTower Aug 21 2020 at 06:20

解決策はおそらく、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);
    }
  }
}