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