异步控制---实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出“end”

时间:2021-01-04 18:17:12

实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出“end”

function func1(callback) {
setTimeout(function () {
console.log("func1");
callback && callback()
}, Math.random() * 100)
} function func2(callback) {
setTimeout(function () {
console.log("func2");
callback && callback()
}, Math.random() * 100)
}
function func3(callback) {
setTimeout(function () {
console.log("func3");
callback && callback()
}, Math.random() * 100)
} asyncAll([func1,func2,func3]); //输出(注:输出的func1,func2,func3为无序);
func2
func1
func3
end

思路:声明一个全局变量count=arr.length,用来计数,每执行一次回调参数count--;直到count=0;代表所有的参数执行完毕,然后输出end。代码如下

function asyncAll(arr) {
var count = arr.length; function fn() { count--;
if (count === 0) {
console.log("end")
}
} arr.forEach(function (ele) {
ele(fn);
});
}

若要按指定顺序执行,例如func1,func2,func3的顺序执行。

function asyncAll([func1,func2,func3]){
func1(function(){
func2(function(){
func3();
})
});
}