详解vue中使用axios对同一个接口连续请求导致返回
网络编程 2021-07-04 15:02www.168986.cn编程入门
这篇文章主要介绍了详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们狼蚁网站SEO优化随着长沙网络推广来一起学习学习吧
业务上出现一个问题如果连续对同一个接口发出请求,参数不同,有时候先请求的比后请求的返回数据慢,导致数据顺序混乱,或者数据被覆盖的问题,所以需要控制请求的顺序。
解决方法:
1.直接跟后台沟通,将所有参数放到数组里后台统一接收并返回所有数据再由前端进行数据的拆分使用。
2.对于出现返回的数据混乱问题。
假设场景 页面中需要对三个部门请求对应的部门人员,三个部门人员的数据为一个二维数组,连续发送请求,但由于返回数据的顺序不定,导致数组中的数据顺序不是按照部门的顺序。
解决方法使用promise.all + axios。
//获取部门人员的请求 getDepartPerson (departData) { let that = this return new Promise(function(resolve,reject) { that.$axios({ method: 'get', url: ..., params: { ... } }).then(res => { const data = res.data.map(item => { return { value: item.userId, label: item.userName } }) resolve(data) }) }) }, //使用promise.all控制返回的数据顺序 setPersonData() { const data = [{ departId: 1, departName: '部门1' }, { departId: 2, departName: '部门2' }, { departId: 3, departName: '部门3' }] let promise1 = this.getDepartPerson(data[0]) let promise2 = this.getDepartPerson(data[1]) let promise3 = this.getDepartPerson(data[2]) console.log(promise1,promise2,promise3) let that = this Promise.all([promise1,promise2,promise3]).then(value => { console.log(value) //value返回的数据是按顺序的 }) },
这里要注意
在promise中this不能指向vue的,所以在promise使用前赋值
let that = this
3.对于返回数据出现覆盖的问题
假设场景切换菜单的时候总是会向后台发送同一个请求,不同参数。且假设这几个菜单共用vuex中的一个state,假设从a菜单切换到b菜单中,a返回的数据比b返回的慢,导致覆盖了state,此时虽然切换到b菜单,页面上的数据是a的数据。
解决方法使用axios中的CancelToken,对于之前的请求进行禁止。
//取消接口相同参数不同的处于pending状态下的请求 export const pending = [] let CancelToken = axios.CancelToken let cancelPending = (config) => { for(let i=pending.length-1; i>=0; i--){ if (!!config) { if (pending[i].u === config.url && pending[i].delPending) { console.log('delete request') pending[i].f() // 取消请求 pending.splice(i, 1) // 移除当前请求记录 } } else { pending[i].f() // 取消请求 pending.splice(i, 1) // 移除当前请求记录 } } }
接着在请求前进行拦截
/ 请求前拦截 / export function requestSuessFunc (config) { cancelPending(config) config.cancelToken = new CancelToken((c) => { pending.push({'u': config.url, 'f': c, delPending: config.delPending}) }) return config } / 请求结果预处理 @param response @returns {Promise<never>} / export function responseSuessFunc (response) { cancelPending(response.config) }
拓展如果在切换路由的时候可以将之前页面中请求处于pengding状态的取消
export function routerAfterEachFunc () { // 这里可以做路由后操作 //切换路由时取消之前页面处于pending的请求 for(let i=pending.length-1; i>=0; i--){ pending[i].f() // 取消请求 pending.splice(i, 1) // 移除当前请求记录 } console.log(pending) } .... const ROUTER = new Router({ routes: CONST_ROUTER }) ROUTER.afterEach(routerAfterEachFunc) export default ROUTER
4.假设这里不是请求同一个接口,而是上一个接口返回的数据作为下一个接口请求的参数,这是可以使用async await
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南