axios 取消请求

解决思路

在发送第二次请求的时候如果第一次请求还未返回,则取消第一次请求,以保证后发送的请求返回的数据不会被先发送的请求覆盖。

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();

可行方案

代码如下:

/* 接口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请求时,会取消之前发送的请求保证返回数据为最后一次请求返回的数据。

原文地址:https://www.cnblogs.com/crazycode2/p/9625540.html