更新时间:2018年09月26日 15:35:00 作者:little_why
今天小编就为大家带来一篇axios取消请求的实践记录分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
问题的来源
用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 request
cancel();
不可行方案
注:本例采用的的axios的实例发送请求,其他情况未测试
初始方案A
请求时的代码如下:
/* 接口listApi.getList方法如下 */
const CancelToken = axios.CancelToken
const source = CancelToken.source()
getVideoList ({
return axiosInstance.post('/video/list', {
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 ({
return axiosInstance.post('/video/list', {
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取消请求的实践记录分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
-
-
-
-
vue + element-ui实现简洁的导入导出功能
Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint UI,下面这篇文章主要给大家介绍了关于利用vue + element-ui如何实现简洁的导入导出功能的相关资料,需要的朋友可以参考下。
2017-12-12
-
vue组件之间通信实例总结(点赞功能)
这篇文章主要介绍了vue组件之间通信,结合实例形式分析了vue父子组件、兄弟组件之间通信的原理、实现方法,并给出了一个类似点赞功能的总结实例,需要的朋友可以参考下
2018-12-12
-
-
-
第一次接触神奇的前端框架vue.js
第一次接触神奇的vue.js,主要了解一下v-model、v-if、v-else、v-show、v-for等,感兴趣的小伙伴们可以一起学习一下
2016-12-12
-
-
Vue 请求传公共参数的操作
这篇文章主要介绍了Vue 请求传公共参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
2020-07-07
-