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);
}

취소 task1의 것은 task2하지 작업, 아마도 때문에하지 task2호출하지 않았다을 task1. 내가 어떻게 접근 할 수 있는지 아는 사람 있나요?

답변

1 NicholasTower Aug 21 2020 at 06:20

해결책은 아마도 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);
    }
  }
}