通过传奇取消请求

时间:2018-04-28 16:17:44

标签: javascript reactjs axios es6-promise redux-saga

我们在顶部提供了一个下拉选项..我们说它有选项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取消取消?

3 个答案:

答案 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

它会自动为你做这些事情 - 如果一个已取消的传奇,请求会自动中止,所以你甚至不需要考虑它。