在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 相关文章推荐
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
js prototype 格式化数字 By shawl.qiu
Apr 02 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
详解Angular 4.x 动态创建组件
Apr 25 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
Dec 19 Vue.js
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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP xpath()函数讲解
2019/02/11 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
js实现右键菜单功能
2016/11/28 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
python 换位密码算法的实例详解
2017/07/19 Python
pandas数值计算与排序方法
2018/04/12 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
计算机应用毕业生自荐信
2013/10/23 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
诚信贷款承诺书
2014/05/30 职场文书
国企干部对照检查材料
2014/08/22 职场文书
仙境之桥观后感
2015/06/16 职场文书
python 如何用terminal输入参数
2021/05/25 Python
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python