在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 相关文章推荐
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
Mar 02 Javascript
用jquery设置按钮的disabled属性的实现代码
Nov 28 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 Javascript
JavaScript学习笔记之数组求和方法
Mar 23 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
JavaScript实现垂直滚动条效果
Jan 18 Javascript
js以及jquery实现手风琴效果
Apr 17 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
Vue起步(无cli)的啊教程详解
Apr 11 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
Apr 16 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之第一天
2006/10/09 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
Python中splitlines()方法的使用简介
2015/05/20 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
快速了解python leveldb
2018/01/18 Python
Django数据库表反向生成实例解析
2018/02/06 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
实习生单位鉴定意见
2013/12/04 职场文书
学雷锋演讲稿
2014/03/04 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
八项规定对照检查材料
2014/08/31 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书