时间:2021-05-28
问题的来源
用el-autocomplete远程获取数据时,点击输入框会触发第一次请求,然后输入搜索文字后会触发第二次请求,两次请求间隔较短,有时候会出现第二次请求比第一次请求先返回的情况,导致我们期望的第二次发送的请求返回的数据会被第一次请求返回的数据覆盖掉
解决思路
在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖。
axios官方文档取消请求说明
方法一:
const CancelToken = axios.CancelToken;const source = CancelToken.source();axios.get('/user/12345', { cancelToken: source.token}).catch(function(thrown) { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } else { // handle error }});axios.post('/user/12345', { name: 'new name'}, { cancelToken: source.token})// cancel the request (the message parameter is optional)source.cancel('Operation canceled by the user.');方法二:
const CancelToken = axios.CancelToken;let cancel;axios.get('/user/12345', { cancelToken: new CancelToken(function executor(c) { // An executor function receives a cancel function as a parameter cancel = c; })});// cancel the requestcancel();不可行方案
注:本例采用的的axios的实例发送请求,其他情况未测试
初始方案A
请求时的代码如下:
const CancelToken = axios.CancelTokenconst source = CancelToken.source()getVideoList ({ key}) { return axiosInstance.post('/video/list', { key }, { cancelToken: source.token })},cancelRequest () { // 取消请求 source.cancel()}getList (query, cb) { // 取消之前的请求 listApi.cancelRequest() // 发送请求 listApi.getVideoList({key: 'value'}).then(resp => { // handle response data }).catch(err => { if (axios.isCancel(err)) { console.log('Request canceled!') } else { this.$message.error(err.message) } })}此时chrome的Network面板并未发送getVideoList请求,控制台输出Request canceled!
原因猜想如下:
执行listApi.cancelRequest()时会将listApi.getVideoList({key: 'value'})返回的Promise状态置为reject,因此在执行listApi.getVideoList({key: 'value'})时并未发送请求,而直接执行catch块中的代码,在控制台输出Request canceled!。
改进方案B
将getList方案改造如下:
getList (query, cb) { // 发送请求 listApi.getVideoList({key: 'value'}).then(resp => { // handle response data // 取消请求 listApi.cancelRequest() }).catch(err => { if (axios.isCancel(err)) { console.log('Request canceled!') } else { this.$message.error(err.message) } })}此时发送两个请求时,会在第一个请求返回后取消别一个请求,并在控制台输出Request canceled!,但当取消请求触发后,再次触发getList方法时结果同方案A。
原因猜想如下:
用方法一触发取消请求后,此后触发该请求均返回同一个已经被reject的Promise,因此此例中请求取消后再次执行getList方法时并未发送getVideoList请求,而是在控制台直接输出Request canceled!
可行方案
可行方案C
代码如下:
const CancelToken = axios.CancelTokenlet cancelgetVideoList ({ key}) { return axiosInstance.post('/video/list', { key }, { cancelToken: new CancelToken(function executor (c) { cancel = c }) })},cancelRequest () { // 第一次执行videoService.cancelRequest()时还未发送getVideoList请求,会报错,添加如下判断 if (typeof cancel === 'function') { // 取消请求 cancel() }}getList (query, cb) { // 取消之前的请求 listApi.cancelRequest() // 发送请求 listApi.getVideoList({key: 'value'}).then(resp => { // handle response data }).catch(err => { if (axios.isCancel(err)) { console.log('Request canceled!') } else { this.$message.error(err.message) } })}此时重复发送多次`getVideoList请求时,会取消之前发送的请求保证返回数据为最后一次请求返回的数据。
以上这篇axios取消请求的实践记录分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文主要跟大家介绍了关于使用axios的一些心得技巧,分享出来供大家参考学习,下面来一起看看详细的介绍:一、带cookie请求axios默认是请求的时候不会带上
本文介绍了vue中axios处理http发送请求的示例(Post和get),分享给大家,具体如下:axios中文文档 https://github.com/m
Cover在Vue中使用axios这个老生常谈了,还是先记录一遍,方面后面自己查。!!!设置form-data请求格式直接翻到后面看。1.安装axios在项目下
本文介绍了浅谈在Vue-cli里基于axios封装复用请求,分享给大家,具体如下:安装只用安装一个axios就可以了。npminstallaxios--save
本文实例为大家分享了vue+axios实现post文件下载的具体代码,供大家参考,具体内容如下功能:点击导出按钮,提交请求,下载excel文件;这里是axios