对于异步函数的串行和并行执行如果处理不好会出现js的回调地狱,在这方面async.js是一个不错的解决方案,有时为了缩小代码体积自己diy一个
//串行执行arr中的函数
var series= function (arr, callback) {
var counter = 0;
var process = function () {
if (counter < arr.length) {
var fun = arr[counter++];
if (fun) fun(process);
} else {
if (callback) callback();
}
}
process();
}
//并行执行arr中的函数
var parallel= function (arr,callback) {
var counter = arr.length;
var process = function () {
if (!--counter) {
if (callback) callback();
}
}
if (counter == 0) {
if (callback) callback();
} else {
arr.forEach(function (fun) {
if (fun) fun(process);
});
}
}
应用举例:
series([
function (cb) {
setTimeout(function () {
console.log('1');
if (cb) cb();
}, 100);
},
function (cb) {
console.log('2');
if (cb) cb();
},
function (cb) {
console.log('3');
if (cb) cb();
},
], function () {
console.log('complete');
});
输出:
1
2
3
complete
parallel([
function (cb) {
setTimeout(function () {
console.log('1');
if (cb) cb();
}, 100);
},
function (cb) {
console.log('2');
if (cb) cb();
},
function (cb) {
console.log('3');
if (cb) cb();
},
], function () {
console.log('complete');
})
输出:
2
3
1
complete
可以看出series会按定义的顺序执行,parallel不会按定义的顺序执行,但是complete都会在前面的序列执行完成再执行