在vue项目中promise解决回调地狱和并发请求的问题


Posted in Javascript onNovember 09, 2020

场景需求:

需要同时请求5个接口

都请求成功后执行下一步操作

解决方法:

定义一个变量i=5,请求成功一个接口,让i?,直到i=0时执行下一个操作,否则不执行

axios.all 并发请求,.then(axios.spread(function(callback1, callback2)){})

promise.all 并发请求,.then(function([callback1, callback2]){})

1、回调地狱:

函数作为参数层层嵌套

代替的为.then的链式操作

2、promise.all并发请求

引入接口

import {getSellerDetail} from '../../api/seller'

import {getMemberCardInfo} from '../../api/pay_online/index'

数据处理

1. 创建一个Promise实例,获取数据

2. 并把数据传递给处理函数resolve和reject

3. promise在声明时就执行了

created(){
  if (this.$route.query.type){
    this.type = this.$route.query.type;
    this.sellerId = this.$route.query.targetId;
    this.initApi()
  }
},
methods: {
  initApi(){
    `// 商户信息`
    let SellerDetailApi = new Promise((resolve, reject) => {
      getSellerDetail(this.sellerId).then( res => {
        resolve(res)  // resolve(res.data)
      }).catch( err => {
        reject(res)
      })
    })
    `// 会员卡信息`
    let MemberCardInfoApi = new Promise((resolve, reject) => {
      getMemberCardInfo(this.sellerId, this.payMoney).then( res => {
        resolve(res) // resolve(res.data)
      }).catch( err => {
        reject(res)
      })
    })
    `// Promise的all方法,等数组中的所有promise对象都完成执行`
    Promise.all([SellerDetailApi, MemberCardInfoApi]).then( res => {
      this.loading = false;
      // 商户信息
      this.detail = res[0].data.detail;
      this.sellerPic = this.detail.picture;
      this.sellerName = this.detail.name;
      this.discount = this.detail.discount;
      // 会员卡信息
      this.cardDetail = res[1].data;
      this.balance = this.cardDetail.balance; //余额
      this.rechargeTip = this.cardDetail.rechargeTip; // 付款金额提示充值
    }).catch( err => {
      console.log(err)
    })
  }
}

3、接口返回:

promise.all中console.log(res) 返回的是数组接口返回

在vue项目中promise解决回调地狱和并发请求的问题

4、注意:

Promise.all 缺陷 如果其中某个任务出现异常(reject),所有任务都会挂掉,Promise直接进入 reject 状态至catch回调。

Promise.allSettled 无论一个任务正常或者异常,都会返回对应的的状态,可以解决上述问题

补充知识:vue项目中Promise同步请求

1.js中定义Promise

export function wxLogin() {
 let pResult = new Promise((resolve, reject) => {
 uni.login({
  provider: 'weixin',
  success: (res) => {
  console.log('login success:', res);
  // return res;
  setTimeout(function() {
   resolve(res);
  }, 3000);
  },
  fail: (err) => {
  console.log('login fail:', err);
  reject(err);
  }
 });
 }).catch(res => {
 console.log(666, res);
 })
 return pResult;
}

2.vue文件中使用

import {login,wxLogin} from '@/common/login.js'
 
  (async () => {
  //获取授权状态
  console.log(1111,"111")
  let aaa = await wxLogin();
  console.log(3333,"3333");
  console.log(4444,aaa);
  })()

以上这篇在vue项目中promise解决回调地狱和并发请求的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js getElementsByTagName的简写方式
Jun 27 Javascript
javascript中最常用的继承模式 组合继承
Aug 12 Javascript
修改jQuery Validation里默认的验证方法
Feb 14 Javascript
使用Java实现简单的server/client回显功能的方法介绍
May 03 Javascript
购物车选中得到价格实现示例
Jan 26 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 Javascript
Vue函数式组件-你值得拥有
May 09 Javascript
node实现socket链接与GPRS进行通信的方法
May 20 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 Javascript
vue 中的动态传参和query传参操作
Nov 09 #Javascript
你不知道的SpringBoot与Vue部署解决方案
Nov 09 #Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 #Javascript
原生JavaScript实现五子棋游戏
Nov 09 #Javascript
Nuxt的动态路由和参数校验操作
Nov 09 #Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 #jQuery
JS实现炫酷轮播图
Nov 15 #Javascript
You might like
php横向重复区域显示二法
2008/09/25 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
js 幻灯片的实现
2011/12/06 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
儿童编程python入门
2018/05/08 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
python遍历小写英文字母的方法
2019/01/02 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python如何实现单链表的反转
2020/02/10 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
职称自我鉴定
2013/10/15 职场文书
文秘专业毕业生就业推荐信
2013/11/08 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang