详解如何构建Promise队列实现异步函数顺序执行


Posted in Javascript onOctober 23, 2018

场景

有a、b、c三个异步任务,要求必须先执行a,再执行b,最后执行c

且下一次任务必须要拿到上一次任务执行的结果,才能做操作

思路

我们需要实现一个队列,将这些异步函数添加进队列并且管理它们的执行,队列具有First In First Out的特性,也就是先添加进去的会被先执行,接着才会执行下一个(注意跟栈作区别)

大家也可以类比一下jQuery的animate方法,添加多个动画也会按顺序执行

解决

模拟3个异步函数

// 异步函数a
var a = function () {
 return new Promise(function (resolve, reject) {
  setTimeout(function () {
   resolve('a')
  }, 1000)
 })
}

// 异步函数b
var b = function (data) {
 return new Promise(function (resolve, reject) {
  resolve(data + 'b')
 })
}

// 异步函数c
var c = function (data) {
 return new Promise(function (resolve, reject) {
  setTimeout(function () {
   resolve(data + 'c')
  }, 500)
 })
}

解决方法一(使用then链式操作)

特点:可以满足需求,但是书写比较繁琐

代码

//链式调用
a()
 .then(function (data) {
  return b(data)
 })
 .then(function (data) {
  return c(data)
 })
 .then(function (data) {
  console.log(data)// abc
 })

方法二(构建队列)

特点:封装方法,可移植到别处使用

代码

// 构建队列
function queue(arr) {
 var sequence = Promise.resolve()
 arr.forEach(function (item) {
  sequence = sequence.then(item)
 })
 return sequence
}

// 执行队列
queue([a, b, c])
 .then(data => {
  console.log(data)// abc
 })

方法三(使用async、await构建队列)

同方法二,只是显得更高大上点

代码

async function queue(arr) {
 let res = null
 for (let promise of arr) {
  res = await promise(res)
 }
 return await res
}
queue([a, b, c])
 .then(data => {
  console.log(data)// abc
 })

顺便说一句,bluebird的Promise.reduce也可以用来顺序执行函数,但是可使用的场景非常有限,一般用来读取文件信息,而以上给出的方法,不管你在异步函数中做了什么,只要函数最后返回了一个Promise对象,都可以使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中判断数字\字母\中文的正则表达式 (实例)
Jun 29 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
Apr 01 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
详解vue mixins和extends的巧妙用法
Dec 20 Javascript
Vuex的actions属性的具体使用
Apr 14 Javascript
vue实现在线学生录入系统
May 30 Javascript
JavaScript实现世界各地时间显示
Sep 07 Javascript
Bootstrap FileInput实现图片上传功能
Jan 28 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
Feb 08 Javascript
jquery实现动态添加附件功能
Oct 23 #jQuery
Vue创建头部组件示例代码详解
Oct 23 #Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 #Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 #Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 #jQuery
React SSR样式及SEO的实践
Oct 22 #Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 #Javascript
You might like
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
python程序 线程队列queue使用方法解析
2019/09/23 Python
Python线程指南分享
2019/11/19 Python
Python中内建模块collections如何使用
2020/05/27 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
python如何实现DES加密
2020/09/21 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
学生安全责任书
2014/04/15 职场文书
学生评语大全
2014/04/18 职场文书
总经理岗位职责
2015/02/04 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
Python 全局空间和局部空间
2022/04/06 Python
python blinker 信号库
2022/05/04 Python