Javascript异步流程控制之串行执行详解
作者:helloweilei 发布时间:2024-04-19 09:56:49
标签:js,串行,执行
这篇文章主要讲一下如何串行执行一组异步任务,例如有下面几个任务,在这里我们用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函数继续执行下一个子任务。
在具体的使用中可能会遇到函数之间传递参数的情况,即前一个任务的执行结果需要作为下一个任务的入参,这些都可以对上面的例子稍作修改就可以了~~
来源:https://segmentfault.com/a/1190000025131698


猜你喜欢
- 本篇主要讲述如何基于NUXT的validate方法实现表单的验证。将验证方法封装后,使用的时候只需像:rules="filter_
- 1、ALL OR ANYPython 之所以成为这么一门受欢迎的语言一个原因是它的可读性和表达能力非常强。Python 也因此经常被调侃为&
- 一、断点续传原理所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就
- 正在编写的程序用的很多Windows下的操作,查了很多资料。看到剪切板的操作时,想起以前想要做的一个小程序,当时也没做,现在正好顺手写完。功
- 最近一段时间一直在研究yolo物体检测,基于网络上很少有yolo的分类预训练和yolo9000的联合数据的训练方法,经过本人的真实实验,对这
- 在官网下载源码包:https://www.php.net/downloads.php步骤:1、解压命令:tar -xjvf php.tar.
- 之前写了Python实现登录接口的示例代码,最近需要回顾,就顺便发到随笔上了要求:1.输入用户名和密码2.认证成功,显示欢迎信息3.用户名3
- 关于树莓派四驱小车的运动方向控制、摄像头方向控制已经在前面的两篇博文中介绍过。有需要的可以参考。本文也是基于上述两个python文件就绪的情
- 在安装nodejs时候,有时候我们会把它安装在d盘或别的
- 我们常常看到一个这样的表达式 A=lambda x:x+1可能会一头雾水不知道怎么计算 最基本的理解就是def A(x):retu
- 相信每个前端工程师都有自己喜爱的javascript框架,说情感也好,道信仰也罢,javascript框架带给人的不仅仅是便捷的开发,更有一
- centos下安装配置phpmyadmin,我花了二个晚上,郁闷的我不行,配置phpmyadmin简单吧,很简单,我刚工作的时候,就配置过,
- 前奏为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_test用以后面的测试使用
- 1、首先计算MD5加密的二进制数组(128位),然后再对这个二进制数组进行base64编码(而不是对32位字符串编码)。例如,用Python
- PyTorch 随机数生成占用 CPU 过高的问题今天在使用 pytorch 的过程中,发现 CPU 占用率过高。经过检查,发现是因为先在
- ERROR 2003:Can't connect to MySQL server on 'localhost' (1
- mysql实现sequence功能1.建立sequence记录表CREATE TABLE `sys_sequence` ( `seq_nam
- 有时候可能需要检测下某台机器的服务是不是起来了,或者某台机器的某个库是不是能被连接又不能打开ssms也不想登陆服务器的话就可以用这个方法。1
- 一、问题描述一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No
- #!/usr/bin/py2# -*- coding: utf-8 -*-#encoding=utf-8'''