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 相关文章推荐
List all the Databases on a SQL Server
Jun 21 Javascript
js 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
查看大图功能代码jquery版
Nov 05 Javascript
JavaScript编程的10个实用小技巧
Apr 18 Javascript
jquery datatable后台封装数据示例代码
Aug 07 Javascript
原生JS和JQuery动态添加、删除表格行的方法
May 28 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
JavaScript实现点击按钮直接打印
Jan 06 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
EasyUI学习之Combobox级联下拉列表(2)
Dec 29 Javascript
jQuery选择器之属性过滤选择器详解
Sep 28 jQuery
Node.js成为Web应用开发最佳选择的原因
Feb 05 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 xml实例 留言本
2009/03/20 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
jQuery 一个图片切换的插件
2011/10/09 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
Python高级用法总结
2018/05/26 Python
基于python实现聊天室程序
2018/07/27 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
超简单使用Python换脸实例
2019/03/27 Python
python 实现简单的FTP程序
2019/12/27 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
使用Python实现音频双通道分离
2020/12/25 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Europcar比利时:租车
2019/08/26 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
客户答谢会活动方案
2014/08/31 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书