【发布时间】:2015-03-10 08:22:46
【问题描述】:
我正在编写一个简单的 async.parallel 实现作为学习练习。以下是文档中的描述:
parallel(tasks, [callback]) 运行 tasks 数组中的函数 并行,无需等到前一个函数完成。 如果任何函数将错误传递给其回调,则主 立即使用错误的值调用回调。一旦 任务已完成,结果将传递给最终回调 一个数组。
我不确定如何提前退出,以防其中一个函数返回错误。我向回调传递了一个错误,但当然其他函数会继续执行。
以下是我目前所拥有的;随意在您的机器上试用。
function parallel(tasks, cb) {
cb = cb || function() {};
if (!Array.isArray(tasks)) return cb('tasks must be an array');
if (!tasks.length) return cb();
var res = [];
var completed_count = 0;
for (var i=0; i<tasks.length; i++) {
(function(ind) {
tasks[ind](function(err, val) {
if (err) return complete(err); // <--- !
res[ind] = val;
completed_count++;
if (completed_count === tasks.length) complete(null, res);
});
} (i));
}
};
// ===== test functions =====
function slow(time, cb) {
setTimeout(function() {
cb(null, time);
}, time);
};
function slowError(time, cb) {
setTimeout(function() {
cb('Some Error', time);
}, time);
}
function complete(err, results) {
if (err) return console.log(err);
else return console.log(results);
};
// ===== tests =====
// should return [1000, 2000, 3000]
parallel([slow.bind(null, 1000),
slow.bind(null, 2000),
slow.bind(null, 3000)], complete);
// should exit early
parallel([slowError.bind(null, 1000),
slowError.bind(null, 2000),
slow.bind(null, 3000)], complete);
【问题讨论】:
标签: javascript node.js asynchronous nonblocking