异步函数的串行执行和并行执行

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

posted @ 2017-06-23 10:43  朱现国  阅读(1159)  评论(0编辑  收藏  举报