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