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