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 相关文章推荐
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 Javascript
javascript制作2048游戏
Mar 30 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
Jun 21 Javascript
文件上传插件SWFUpload的使用指南
Nov 29 Javascript
jquery实现弹窗功能(窗口居中显示)
Feb 27 Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
JavaScript修改注册表实例代码
Jan 05 Javascript
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
JavaScript代码实现简单计算器
Dec 27 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
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
javascript几个易错点记录
2014/11/26 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
详解Python多线程
2016/11/14 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
详解重置Django migration的常见方式
2019/02/15 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python实现控制台输出彩色字体
2020/04/05 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
Ajax的优点和缺点
2014/11/21 面试题
学校端午节活动方案
2014/08/23 职场文书
工作年限证明模板
2014/11/01 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
升职自荐信范文
2015/03/27 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL