Redux saga: Bagaimana cara membatalkan satu tugas dari tugas lain yang tidak memulainya?

Aug 21 2020

Saya membaca artikel ini tentang membatalkan tugas di Redux saga. Pada dasarnya contoh yang mereka lakukan seperti ini:

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

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

Di sini mainbisa membatalkan task1karena menyebutnya. Dalam kode saya, saya menjalankan fungsi seperti ini:

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

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

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

Membatalkan task1dalam task2tidak bekerja, mungkin karena task2tidak memanggil task1. Adakah yang tahu bagaimana saya bisa mendekati ini?

Jawaban

1 NicholasTower Aug 21 2020 at 06:20

Solusinya mungkin membuat main do itu sendiri mengimplementasikan sesuatu yang mirip dengan takeLatest, tetapi dengan logika ekstra untuk membatalkan tugas lain.

Jika Anda hanya ingin action2 melakukan pembatalan ekstra, maka akan terlihat seperti ini:

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

Jika Anda ingin kedua tindakan tersebut membatalkan kedua tugas, ini sedikit lebih sederhana:

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