在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 相关文章推荐
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
Sep 10 Javascript
JQuery实现级联下拉框效果实例讲解
Sep 17 Javascript
JS实现IE状态栏文字缩放效果代码
Oct 24 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
微信小程序自定义多选事件的实现代码
May 17 Javascript
在vue项目中引用Iview的方法
Sep 14 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
js实现简单的轮播图效果
Dec 13 Javascript
微信小程序用户授权最佳实践指南
May 08 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 for 循环语句使用方法详细说明
2010/05/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
理解Javascript闭包
2013/11/01 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
django之自定义软删除Model的方法
2019/08/14 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
综治维稳工作汇报
2014/10/27 职场文书
优秀党支部申报材料
2014/12/24 职场文书
信用卡工作证明范本
2015/06/19 职场文书
感恩教师主题班会
2015/08/12 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers