Javascript异步流程控制之串行执行详解


Posted in Javascript onSeptember 27, 2020

这篇文章主要讲一下如何串行执行一组异步任务,例如有下面几个任务,在这里我们用setTimeout模拟一个异步任务:

let taskA = () => setTimeout(() => console.log('run task A'), 100);
let taskB = () => setTimeout(() => console.log('run task B'), 50);
let taskC = () => setTimeout(() => console.log('run task C'), 150);

直接运行

taskA(); taskB(); taskC();

是达不到顺序执行A,B,C 的三个任务的效果的。

首先我们看一下最传统的做法,通过回调的方式在一个任务执行完成之后调用下一个任务:

let taskA = setTimeout(() => {
 console.log('run task A');
 taskB();
}, 100);
let taskB = setTimeout(() => {
 console.log('run task B');
 taskC();
}, 50);
let taskC = setTimeout(() => {
 console.log('run task B');
}, 150);

第二种方法是将每一个任务封装成一个返回Promise的函数, 然后使用使用Promise的链式调用达到串行执行的目的:

let taskA = () => new Promise((resolve, reject) => {
 setTimeout(() => {
  console.log('run task A');
  resolve();
 }, 100);
})
let taskB = () => new Promise((resolve, reject) => {
 setTimeout(() => {
  console.log('run task B');
  resolve();
 }, 50);
})
let taskC = () => new Promise((resolve, reject) => {
 setTimeout(() => {
  console.log('run task C');
  resolve();
 }, 150);
})
function runTasks2() {
  console.log('tasks 2');
  taskA().then(taskB).then(taskC);
}

假设任务的数量不确定,可以通过下面的方式来执行:

function runTasks3(tasks) {
  console.log('tasks 3');
  let pro = tasks[0]();
  for (let i = 1; i < tasks.length; i++) {
  pro.then(tasks[i]);
  }
}

借助于es7的async和await,我们还可以对上面的函数一种写法:

async function runTasks3_1(tasks) {
  for (let i = 0; i < tasks.length; i++) {
  await tasks[i]();
  }
}

在文章的最后我们自己来实现一个串行执行器, 用于执行一组串行任务:

function async(tasks) {
  const count = tasks.length;
  let index = 0;
  const next = () => {
   if (index >= count) return;
   const task = tasks[index++];
   task(next);
  }
  next(0);
}

函数的使用方式如下:

async([
   next => setTimeout(() => { console.log('taskA ...'); next() }, 100),
   next => setTimeout(() => { console.log('taskB ...'); next() }, 50),
   next => setTimeout(() => { console.log('taskC ...'); next() }, 30)
 ]);

在每一个子任务中我们通过调用next函数继续执行下一个子任务。

在具体的使用中可能会遇到函数之间传递参数的情况,即前一个任务的执行结果需要作为下一个任务的入参,这些都可以对上面的例子稍作修改就可以了~~

到此这篇关于Javascript异步流程控制之串行执行详解的文章就介绍到这了,更多相关Javascript串行执行内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
jquery 图片预加载 自动等比例缩放插件
Dec 25 Javascript
javascript web页面刷新的方法收集
Jul 02 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
Ruffy javascript 学习笔记
Nov 30 Javascript
javascript中声明函数的方法及调用函数的返回值
Jul 22 Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 Javascript
js实现上传并压缩图片效果
Jan 10 Javascript
React 高阶组件入门介绍
Jan 11 Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 Javascript
vue+elementUI 实现内容区域高度自适应的示例
Sep 26 #Javascript
Openlayers实现测量功能
Sep 25 #Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 #Javascript
JQuery Ajax如何实现注册检测用户名
Sep 25 #jQuery
Openlayers测量距离与面积的实现方法
Sep 25 #Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 #Javascript
OpenLayers3实现测量功能
Sep 25 #Javascript
You might like
Session的工作方式
2006/10/09 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
PDO::rollBack讲解
2019/01/29 PHP
jQuery 表单验证扩展(三)
2010/10/20 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
python发送HTTP请求的方法小结
2015/07/08 Python
mac系统安装Python3初体验
2018/01/02 Python
对Python w和w+权限的区别详解
2019/01/23 Python
详解python中init方法和随机数方法
2019/03/13 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
2015年政教主任工作总结
2015/07/23 职场文书