【发布时间】:2021-12-11 12:25:40
【问题描述】:
我有一个设置为使用 redux saga 的 react 项目,但由于某种原因,我无法取消正在运行的 saga / action 任务。期望的是,在某些操作之后(例如用户导航离开或单击按钮),正在运行的 saga 将被取消。尝试捕捉取消的动作,但在 saga 完全运行后不会发生:
function* fetchOverviewSaga(): SagaReturnType<any> {
try {
yield delay(5000);
console.log('still running');
const response = yield call(getOverviewData);
console.log('still running');
yield all([
put(updateTagsPendingState(false)),
put(updateTagsDataState(response.items)),
]);
} finally {
if(yield cancelled()) {
console.log('saga task canceled');
}
}
}
function* cancelOverviewSaga(): SagaReturnType<any> {
const runningAction = yield fork(fetchOverviewSaga);
yield cancel(runningAction);
}
function* overviewSaga() {
yield all([
takeLatest(startOverview, fetchOverviewSaga),
takeLatest(cancelOverview, cancelOverviewSaga)
]);
}
结果是,即使在调度操作以取消 (cancelOverviewSaga) 之后,fetchOverviewSaga 仍然运行,只有在它完全完成运行后才会在 if(yield cancelled()) 中捕获。不确定这是否是实际行为,预计会在请求时取消。欢迎任何想法。
*编辑:
在调用取消操作时,fetchOverviewSaga 似乎被取消了,因为它确实记录了saga task canceled,但是剩下要运行的是来自yield all([..])) 的块,看着控制台,可能问题出在那个块
*编辑2:
为了更好地说明行为:
- 调度 startOverview 操作
- 立即取消
- 日志:saga 任务已取消
- 5000 毫秒后(在 fetchOverviewSaga 中延迟结束)
- 日志:'still running' x2 并从 fetchOverviewSaga 调度 yield all
【问题讨论】:
标签: reactjs generator redux-saga