Redux saga: Bagaimana cara membatalkan satu tugas dari tugas lain yang tidak memulainya?
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 main
bisa membatalkan task1
karena 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 task1
dalam task2
tidak bekerja, mungkin karena task2
tidak memanggil task1
. Adakah yang tahu bagaimana saya bisa mendekati ini?
Jawaban
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);
}
}
}