在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 相关文章推荐
javascript Onunload与Onbeforeunload使用小结
Dec 31 Javascript
javascript 单例/单体模式(Singleton)
Apr 07 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
Nov 19 Javascript
js判断浏览器版本以及浏览器内核的方法
Jan 20 Javascript
Angular2表单自定义验证器的实现
Oct 19 Javascript
jQuery插件版本冲突的处理方法分析
Jan 16 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
详解node.js平台下Express的session与cookie模块包的配置
Apr 26 Javascript
AngularJS表单验证功能
Oct 19 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
Vue侦测相关api的实现方法
May 22 Javascript
Vue.js下拉菜单组件使用方法详解
Oct 19 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
微信红包随机生成算法php版
2016/07/21 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
Javascript中replace()小结
2015/09/30 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
开工仪式策划方案
2014/05/23 职场文书
霸气队列口号
2014/06/18 职场文书
流动人口婚育证明
2014/10/19 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫