关于axios中封装cancelToken去处理重复请求和页面跳转后追回请求

解决方案的主要原理是使用axios内部的cancelToken去撤回请求。
详细的使用方法可以参考axios官网
关于源码也可以去了解axios源码解析-取消请求

接下来是我自己总结补充的一些使用方法和注意点

axios其他的配置项就先不关注了,我这里用vuex去存储配置cancelToken的值和相关调用方法,重点在于方法的调用,而不是用什么方式。同样可以用全局的window对象或者vue全局对象存储,也可以用模块化的方式配置。

上代码

1.state定义用于存放cancelToken的Map对象。愿意使用数组也可,将修改Map对象的方法改为修改数组的方法即可。

 cancelTokenArr: new Map(),//用于axios在跳转页面时批量撤回请求

2.mutations配置用于修改state值的方法

 //添加cancel的方法
 pushToken (state, payload) {
    state.cancelTokenArr.set(payload.uniqueCode,payload.cancelToken)
  },
  //删除cancel的方法
  clearToken(state, payload){
    state.cancelTokenArr.delete(payload.uniqueCode)
  },
  //遍历执行cancel的方法,执行后重置
  reqBackAndClearToken (state) {
    state.cancelTokenArr.forEach(item => {
        item('路由跳转取消上一页的请求')//item为存储的cancel方法,string可传值可不传值。string对应cancelError中的message,可用于区分不同的cancel调用
    })
    state.cancelTokenArr.clear()
  },

3.配置interceptors.request。将每一条的请求存入一个cancelToken 。
注意:

  • 此处的配置是在store.js文件中,不同的配置方式调用的方法不同。合理参考,自由使用
  • config.data根据自己项目的请求方式去配置,目的是保证key值的唯一性。(例如配置时间戳+url+data+type)(根据自身项目灵活配置)
  • config.cancelToken = new axios.CancelToken…(此处必须给config.cancelToken赋值操作,目的是执行cancel方法的时候有效执行!直接调用new axios.CancelToken()获取内部的cancel是无效方法)
  • 此处我的if操作是将后面的重复请求直接撤回(浏览器network不会有记录),else操作是将cancelToken收集起来,用于页面跳转时清除还没有完成的请求(此时会有记录标记状态为canceled)。
service.interceptors.request.use(config => {
  if(state.cancelTokenArr.get(config.data)){
    config.cancelToken = new axios.CancelToken(cancel=>cancel('后面重复的请求在没有成功返回之前直接撤回'))
  }else{
    config.cancelToken = new axios.CancelToken((cancel) => {
      mutations.pushToken(state,{uniqueCode:config.data, cancelToken: cancel})
    })
  }
 }

4.配置interceptors.response。将每一条完成后的请求中的cancelToken从Map对象中移除。

  • 此处的response.config.data等于interceptors.request中的config.data
  • 将完成后的cancelToken移除
  • error需要特殊处理,使用axios.isCancel(error)判断错误类型
service.interceptors.response.use(response => {
	const uniqueCode = response.config.data
    if (state.cancelTokenArr.get(uniqueCode)) {
      mutations.clearToken(state,{uniqueCode})
    }
},
error => {
	if(axios.isCancel(error)) return new Promise(()=>{})//此处将error状态特殊处理,返回Promise的pending状态,目的是为了中断promise链式执行代码,这样就不会执行后面的then和catch了
    return Promise.reject(error)//通用错误处理
})

5.在路由跳转钩子中批量撤回请求。此处配置在main.js中,注意调用方法。

router.beforeEach((to, from, next) => {
  store.commit('reqBackAndClearToken')//后续修改需要在每一个next()之前添加
  next();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Vue 2 ,可以使用 Axios 库来封装网络请求。以下是一种将请求、接口地址和方法分开的页面封装方法: 1. 首先,创建一个 `api.js` 文件,用于存放所有的接口地址和请求方法,例如: ```javascript import axios from 'axios' // 定义接口地址 const BASE_URL = 'https://api.example.com' // 封装 GET 请求方法 export function getRequest (url, params) { return axios.get(`${BASE_URL}${url}`, { params }) } // 封装 POST 请求方法 export function postRequest (url, data) { return axios.post(`${BASE_URL}${url}`, data) } // 封装 PUT 请求方法 export function putRequest (url, data) { return axios.put(`${BASE_URL}${url}`, data) } // 封装 DELETE 请求方法 export function deleteRequest (url) { return axios.delete(`${BASE_URL}${url}`) } ``` 2. 在需要调用接口的页面,引入 `api.js` 文件,并调用其请求方法,例如: ```javascript import { getRequest, postRequest } from '@/api.js' // 调用 GET 请求方法 getRequest('/users', { page: 1 }) .then(response => { console.log(response.data) }) .catch(error => { console.error(error) }) // 调用 POST 请求方法 postRequest('/login', { username: 'admin', password: '123456' }) .then(response => { console.log(response.data) }) .catch(error => { console.error(error) }) ``` 这样,就可以将请求、接口地址和方法分开,便于管理和维护。 ### 回答2: 在Vue2,我们可以使用axios来发送HTTP请求,并且可以通过封装请求接口方法,将请求、接口地址和方法分开到不同的页面,提高代码的可读性和维护性。 首先,在项目导入axios和相关依赖。可以通过npm或者CDN的方式导入axios和Vue相关的库。 接下来,创建一个util文件夹,并在该文件夹创建一个api.js文件,用于封装请求接口方法。 在api.js文件,我们可以定义一个对象,用来存储各个接口的请求方法。 ```javascript // api.js import axios from 'axios'; const api = { getUserInfo() { return axios.get('/api/user'); }, login(params) { return axios.post('/api/login', params); }, logout() { return axios.get('/api/logout'); }, // 其他接口... }; export default api; ``` 在以上代码,我们定义了一个api对象,该对象包含了getUserInfo、login、logout等接口的请求方法。这些方法通过axios发送HTTP请求,并返回一个Promise对象。 接下来,在需要使用接口的页面,可以通过import语句引入api.js文件,从而可以调用相应的接口方法。 ```javascript // Home.vue import api from '@/utils/api'; export default { name: 'Home', mounted() { this.getUser(); }, methods: { getUser() { api.getUserInfo() .then(response => { console.log(response.data); }) .catch(error => { console.log(error); }); }, // 其他方法... } } ``` 以上代码是一个Home页面的示例,通过引入api.js文件,并调用getUserInfo接口方法,获取用户信息。在then回调,我们可以处理返回的数据。在catch回调,我们可以处理请求出错的情况。 通过将请求、接口地址和方法分开到不同的页面,我们可以使代码结构更加清晰,易于维护和管理。同时,可以在api.js文件统一处理请求的错误信息和请求的统一配置,增加灵活性。 ### 回答3: 在Vue2使用axios封装请求接口方法,可以将请求、接口地址和方法分开到不同的页面。 首先,创建一个名为api.js的文件,用于集管理所有的接口地址,例如: ```javascript // api.js const baseURL = 'http://api.example.com'; // 设置接口的基础地址 export default { login: baseURL + '/login', // 登录接口 getUserInfo: baseURL + '/getUserInfo', // 获取用户信息接口 // 其他接口... } ``` 接下来,创建一个名为request.js的文件,用于统一封装axios请求方法,例如: ```javascript // request.js import axios from 'axios'; axios.defaults.timeout = 5000; // 设置请求超时时间 export default function request(url, method, data) { return new Promise((resolve, reject) => { axios({ url, method, data }).then(res => { resolve(res.data); }).catch(error => { reject(error); }); }); } ``` 最后,在需要发送请求的组件,引入api.js和request.js,并调用请求方法,例如: ```javascript // MyComponent.vue import api from './api.js'; import request from './request.js'; export default { methods: { login() { request(api.login, 'post', { // 调用登录接口 username: 'admin', password: '123456' }).then(res => { console.log('登录成功:', res); }).catch(error => { console.log('登录失败:', error); }); }, getUserInfo() { request(api.getUserInfo, 'get') // 调用获取用户信息接口 .then(res => { console.log('获取用户信息成功:', res); }).catch(error => { console.log('获取用户信息失败:', error); }); }, // 其他请求方法... } } ``` 这样,我们将请求、接口地址和方法都分开到不同的页面,使代码更加清晰和可维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值