实现一个串行异步执行类

  目录

写一个按顺序执行操作的类工具

实现一个串行异步执行类

今天在学习webpack源码时,看到了webpack的核心模块tapable,里边有很多方法,其中之一就是串行异步执行方法,于是,自己准备实现一个简单的,其实很简单,见下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 声明类SerialAsync
function SerialAsync() {
this.arrFns = [];
}
// 原型链上添加addFn方法
SerialAsync.prototype.addFn = function(fn) {
this.arrFns.push(fn);
}
// 原型链上添加emitFn方法
SerialAsync.prototype.emitFn = function(callback) {
let self = this;
let index = 0;
// next是核心代码
function next(par) {
let fn = self.arrFns[index++];
fn?fn(next):callback(par);
}
next();
}
// SerialAsync结束
// 是不是超级的简单,就15行代码,记住,核心代码是next方法
// 下面是具体的使用
var s = new SerialAsync();
s.addFn(function(done){
setTimeout(function(){
console.log(1);
done(1);
}, 1000)
});
s.addFn(function(done){
setTimeout(function(){
console.log(2);
done(2);
}, 2000);
});
s.addFn(function(done){
setTimeout(function(){
console.log(5);
done(2);
}, 5000);
});
console.time();
s.emitFn((par)=>{
console.log('over->', par);
console.timeEnd();
});

可以看到,最关键部分就是next函数,有个递归的过程,据说,nodejs中很多类似的串行方法都是这么实现的,一定要记住哦。