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 相关文章推荐
解析dom中的children对象数组元素firstChild,lastChild的使用
Jul 10 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
利用Angularjs实现幻灯片效果
Sep 07 Javascript
javascript 中的事件委托详解
Oct 25 Javascript
JavaScript装饰器函数(Decorator)实例详解
Mar 30 Javascript
vue+webpack实现异步组件加载的方法
Feb 03 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
Sep 07 Javascript
解决vue 单文件组件中样式加载问题
Apr 24 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
PHP在linux上执行外部命令的方法
2017/02/06 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
Python的Lambda函数用法详解
2019/09/03 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
纽约海:Sea New York
2018/11/04 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
初级Java程序员面试题
2016/03/03 面试题
化学实验员岗位职责
2013/12/28 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
廉洁使者实施方案
2014/03/29 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
经典毕业生求职信
2014/07/12 职场文书
农村文化建设标语
2014/10/07 职场文书
六查六看心得体会
2014/10/14 职场文书
努力学习保证书
2015/02/26 职场文书
合理化建议书范文
2015/09/14 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
基于Redis延迟队列的实现代码
2021/05/13 Redis
python中tkinter复选框使用操作
2021/11/11 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫