在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 源码分析笔记(3) Deferred机制
Jun 19 Javascript
javascript查询字符串参数的方法
Jan 28 Javascript
JavaScript的Date()方法使用详解
Jun 09 Javascript
js检测用户输入密码强度
Oct 22 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
Jul 31 jQuery
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
Mar 13 jQuery
解析vue、angular深度作用选择器
Sep 11 Javascript
继承行为在 ES5 与 ES6 中的区别详解
Dec 24 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按单词截取字符串的方法
2015/04/07 PHP
php给图片加文字水印
2015/07/31 PHP
PHP 中常量的知识整理
2017/04/14 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
xtree.js 代码
2007/03/13 Javascript
js模拟类继承小例子
2010/07/17 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python实现清屏的方法
2015/04/30 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
C语言50道问题
2014/10/23 面试题
房地产员工找工作的自我评价
2013/11/15 职场文书
25岁生日感言
2014/01/13 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
成龙洗发水广告词
2014/03/14 职场文书
四年级评语大全
2014/04/21 职场文书
青春励志演讲稿
2014/04/29 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
投资意向书
2014/07/30 职场文书
python运算符之与用户交互
2022/04/13 Python