axios取消请求的实践记录分享
问题的来源
用el-aulete远程获取数据时,点击输入框会触发第一次请求,然后输入搜索文字后会触发第二次请求,两次请求间隔较短,有时候会出现第二次请求比第一次请求先返回的情况,导致我们期望的第二次发送的请求返回的数据会被第一次请求返回的数据覆盖掉
解决思路
在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖。
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 request cancel();
不可行方案
注本例采用的的axios的实例发送请求,其他情况未测试
初始方案A
请求时的代码如下
/ 接口listApi.getList方法如下 / const CancelToken = axios.CancelToken const 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
代码如下
/ 接口listApi.getList方法如下 / const CancelToken = axios.CancelToken let cancel getVideoList ({ 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取消请求的实践记录分享就是长沙网络推广分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程