封装一个可手动取消的axios请求

1 篇文章 0 订阅

需求描述: 在这里插入图片描述
文件上传过程中,不断请求一个接口,获取实时的导入结果,并以进度条的形式展示在页面上。

思路: 设置计时器,不断向后台发起请求,一旦返回的请求结果为100%就清除计时器,这时会有大量正在pending中的请求,会占用大量的资源,需要手动取消请求。

封装请求: 以get请求为例,与普通请求相比会多设置一个cancelTaken

export const getRequestCanCancel = (url, params, that) => {
    let accessToken = Cookies.get('accessToken');
    return axios({
        method: 'get',
        url: `${ApiBaseUrl}${url}`,
        params: params,
        cancelToken: new axios.CancelToken(function executor(c) { // 设置 cancel token
            that.source = c; //这里的source为使用接口的页面设置的,需要取消请求的时候直接调用在这里已被赋值为函数的source就行了
        }),
        headers: {
            'Authorization': accessToken
        }
    });
};

接口:

export const analysisResumeNum = (params, that) => {
    return getRequestCanCancel('/analysisResumeNum', params, that)
}

data中初始化sourcenull

data{
	return {
		successNum: 0,
      	totalNum: 0,
		guId: null,
		myInterval: null,
		source: null
	}
}

接口应用:

getAnalysisResumeGuId() {
      let that = this;
      that.myInterval = setInterval(() => {
        analysisResumeNum({guId: that.guId}, that).then(res => {  // 
          if(res.success) {
            that.successNum = Number(res.result);
            if(that.totalNum == that.successNum) { //符合条件后清除计时器,然后终止未完成请求
              clearInterval(that.myInterval);
              that.cancelRequest();
            }
          }
        })
      }, 50);
},
cancelRequest() {
      if (typeof this.source === 'function') {  // 先判断source是否已被设置为函数
          this.source('终止请求'); // 调用source函数以终止请求
      }
}
封装一个全局请求接口,可以使用 axios 的拦截器来实现。拦截器可以在请求发送前或响应返回后对请求或响应进行处理,可以用来统一处理请求头、响应拦截、错误处理等操作。下面是一个简单的 axios 封装示例: ```javascript // 导入 axios import axios from 'axios' // 创建 axios 实例 const instance = axios.create({ baseURL: 'http://api.example.com', // 设置请求的基础 URL timeout: 5000 // 设置请求超时时间 }) // 请求拦截器 instance.interceptors.request.use( config => { // 在请求发送之前做些什么 // 统一添加请求头信息 config.headers.Authorization = localStorage.getItem('token') return config }, error => { // 请求错误时做些什么 return Promise.reject(error) } ) // 响应拦截器 instance.interceptors.response.use( response => { // 对响应数据做些什么 return response.data }, error => { // 对响应错误做些什么 if (error.response) { // 根据响应状态码进行错误处理 switch (error.response.status) { case 401: // 未登录,跳转到登录页 break case 403: // 没有权限,提示用户 break case 404: // 请求的资源不存在,提示用户 break default: // 其他错误,提示用户 } } return Promise.reject(error) } ) // 导出封装后的 axios 实例 export default instance ``` 这样就可以在项目中使用封装后的 axios 实例,而不用每次都手动配置请求头、错误处理等操作。例如: ```javascript import axios from '@/utils/request' // 发送 GET 请求 axios.get('/users').then(response => { console.log(response) }) // 发送 POST 请求 axios.post('/login', { username: 'admin', password: '123456' }).then(response => { console.log(response) }) ``` 这里的 `/users` 和 `/login` 是相对于 `baseURL` 的路径,例如 `http://api.example.com/users`、`http://api.example.com/login`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值