在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 最近浏览过的商品的功能实现代码
May 14 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
js实现密码强度检测【附示例】
Mar 30 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
vue脚手架及vue-router基本使用
Apr 09 Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 Javascript
详解Js里的for…in和for…of的用法
Mar 28 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 Javascript
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 Javascript
深入了解Vue动态组件和异步组件
Jan 26 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中显示格式化的用户输入
2006/10/09 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
PHP7新增函数
2021/03/09 PHP
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
React中常见的动画实现的几种方式
2018/01/10 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
layui实现数据分页功能
2019/07/27 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
Python表达式的优先级详解
2020/02/18 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
创业计划书六个要素
2013/12/26 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
2015年大学生工作总结
2015/04/21 职场文书
飞越疯人院观后感
2015/06/09 职场文书
复活读书笔记
2015/06/29 职场文书
2015中学教学工作总结
2015/07/22 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
班级班风口号大全
2015/12/25 职场文书