详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题


Posted in Javascript onNovember 06, 2019

业务上出现一个问题:如果连续对同一个接口发出请求,参数不同,有时候先请求的比后请求的返回数据慢,导致数据顺序混乱,或者数据被覆盖的问题,所以需要控制请求的顺序。

解决方法:

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 requestSuccessFunc (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 responseSuccessFunc (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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javaScript 简单验证代码(用户名,密码,邮箱)
Sep 28 Javascript
setTimeout与setInterval在不同浏览器下的差异
Jan 24 Javascript
JS修改css样式style浅谈
May 06 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
纯js实现手风琴效果
Apr 17 Javascript
js中的面向对象入门
Mar 06 Javascript
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
Javasript设计模式之链式调用详解
Apr 26 Javascript
javascript合并两个数组最简单的实现方法
Sep 14 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 Javascript
vue里使用create, mounted调用方法
Apr 26 Vue.js
vuex state中的数组变化监听实例
Nov 06 #Javascript
element的el-table中记录滚动条位置的示例代码
Nov 06 #Javascript
webpack是如何实现模块化加载的方法
Nov 06 #Javascript
node读写Excel操作实例分析
Nov 06 #Javascript
详解vue页面首次加载缓慢原因及解决方案
Nov 06 #Javascript
electron 安装,调试,打包的具体使用
Nov 06 #Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 #Javascript
You might like
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
Bootstrap表单布局
2016/07/19 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python调用C++程序的方法详解
2017/01/24 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python 解析xml文件的示例
2020/09/29 Python
详解Scrapy Redis入门实战
2020/11/18 Python
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
教师考察材料范文
2014/06/03 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
单位消防安全责任书
2014/07/23 职场文书
教书育人演讲稿
2014/09/11 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
法人身份证明书
2014/10/08 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
辞职信格式模板
2015/02/27 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书