对于异步函数的串行和并行执行如果处理不好会出现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都会在前面的序列执行完成再执行