上节说到了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,写东西的时候才发现心中无墨水啊,各种头晕啊