Redux saga:如何从另一个没有启动它的任务中取消一个任务?
Redux saga: how to cancel one task from another that didn't initiate it?
我正在阅读 this article 关于在 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);
}
在 task2
中取消 task1
不起作用,大概是因为 task2
没有调用 task1
。有谁知道我该如何解决这个问题?
解决方案可能是让 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);
}
}
}
我正在阅读 this article 关于在 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);
}
在 task2
中取消 task1
不起作用,大概是因为 task2
没有调用 task1
。有谁知道我该如何解决这个问题?
解决方案可能是让 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);
}
}
}