详解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。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程