上节说到了async parallel 方法,继续看 async.parallel 方法做了什么事

    async.parallel = function (tasks, callback) {
        callback = callback || function () {};
        if (tasks.constructor === Array) {
            async.map(tasks, function (fn, callback) {
                if (fn) {
                    fn(function (err) {
                        var args = Array.prototype.slice.call(arguments, 1);
                        if (args.length <= 1) {
                            args = args[0];
                        }
                        callback.call(null, err, args);
                    });
                }
            }, callback);
        }
        else {
            var results = {};
            async.forEach(_keys(tasks), function (k, callback) {
                tasks[k](function (err) {
                    var args = Array.prototype.slice.call(arguments, 1);
                    if (args.length <= 1) {
                        args = args[0];
                    }
                    results[k] = args;
                    callback(err);
                });
            }, function (err) {
                callback(err, results);
            });
        }
    };

主要就是吧传进来的 第一个参数 tasks 进行分析 是否是array,分别调用 async.map async.forEach 对 数组,对象进行处理,虽然很简单,不过还是看到constructor 原来是类型来的

那么 治理就只看 async.map 来分析吧。至于为啥,我也不知道,^_^

继续看下去发现 async.map = doParallel(_asyncMap); 

做程序嘛,都喜欢猜一猜,如果没猜错的话,doParallel 应该是核心 异步处理方法,那么继续看看 里面具体做了什么了?

    var doParallel = function (fn) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            return fn.apply(null, [async.forEach].concat(args));
        };
    };

  发现个有意思的事情,为啥 要 return fun了?直接 function doParllel(){……}  有啥不同?至今没想明白,不知道哪位朋友可以提供点意见,

刚才还看到 有个_asyncMap 变量 不细看还不知道里面有乾坤了。

var _asyncMap = function (eachfn, arr, iterator, callback) {
        var results = [];
        arr = _map(arr, function (x, i) {
            return {index: i, value: x};
        });
        eachfn(arr, function (x, callback) {
            iterator(x.value, function (err, v) {
                results[x.index] = v;
                callback(err);
            });
        }, function (err) {
            callback(err, results);
        });
    };

  

代码先贴到这里,有空继续 写,有时候nodejs callback来callback去,转着转着就不知道在干嘛了,o(∩∩)o...哈哈 。回去好好复习复习JS,写东西的时候才发现心中无墨水啊,各种头晕啊  

 

Posted on 2012-08-16 20:25  Darren.Ouyang  阅读(822)  评论(0编辑  收藏  举报