我们在顶部提供了一个下拉选项..我们说它有选项A B C. 每当用户更改下拉选项时,会触发一个saga,它会产生大约10个不同的webapi调用。(并行执行的调用映射)
我们在传奇观察者中使用takeLatest助手。 因此,如果用户立即将下拉列表从A更改为B.,只有通过B进行的调用才会在客户端消耗,因为takeLatest将中止由A触发的传奇。
现在,问题在于只消耗了B的呼叫,所有A的承诺呼叫都处于暂挂状态,也运行完成。 只有saga(因为A)被中止而不是api调用。 我们可以在网络标签中看到。 因此,如果用户在A B C之间相当快速地更改,我们将有大约30-40次调用服务器。 尽管我们只对完成最近10次通话感兴趣,但所有这些都已完成。 如果我们在chrome dev工具中看到,最后10个调用正在排队或停止,直到完成上述调用。 难道没有办法将取消从传奇(最高级别)传播到axios,并通过取消承诺。 Axios文档说关于取消和令牌,但我不清楚如何在redux -Saga和axios环境中传播取消。 如何从saga到axios取消取消?
答案 0 :(得分:3)
const cancelSource = axios.CancelToken.source()
try {
yield all([
call(axios.get, "/api/1", { cancelToken: cancelSource.token }),
call(axios.get, "/api/2", { cancelToken: cancelSource.token }),
/// ...
])
} finally {
if (yield cancelled()) {
yield call(cancelSource, cancelSource.cancel)
}
}
答案 1 :(得分:1)
最佳答案帮助了我,但是,我不得不使用这个电话
yield call(cancelSource.cancel)
答案 2 :(得分:0)
如果有人对这个问题的解决方案感兴趣,我是redux saga库插件的创建者,专门针对这些问题 - https://github.com/klis87/redux-saga-requests
它会自动为你做这些事情 - 如果一个已取消的传奇,请求会自动中止,所以你甚至不需要考虑它。