async.series和async.parallel之间有什么区别。考虑以下例子,我得到了相同的结果。
async.parallel([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
},
function(callback){
setTimeout(function(){
var err = new Error('I am the error');
callback(err);
}, 400);
},
function(callback){
setTimeout(function(){
callback(null, 'three');
}, 600);
},
],
// optional callback
function(err, results){
if(err){
console.log('Error');
} else {
}
console.log(results);
//results is now equal to [ 'one', 'two', undefined ]
// the second function had a shorter timeout.
});
和
async.series([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
},
function(callback){
setTimeout(function(){
var err = new Error('I am the error');
callback(err);
}, 400);
},
function(callback){
setTimeout(function(){
callback(null, 'three');
}, 600);
}
],
// optional callback
function(err, results){
//results is now equal to [ 'one', 'two', undefined ]
if(err){
console.log('Error');
} else {
}
console.log(results);
});
我没有看到差异。也许我的样本不好?我在github async存储库上阅读了关于这两个函数的文档,你可以找到async.parallel函数:
如果任何函数将错误传递给其回调,则为main 立即使用错误值
调用回调
async.parallel中的主要回调是什么?
答案 0 :(得分:34)
async.series
以串行方式调用您的函数(等待前一个函数在下一个开始之前完成)。 async.parallel
将同时启动它们(或者无论如何都可以在单线程中同时启动它们。)
主要回调是在async.parallel
或async.series
(签名为async.parallel(tasks, [callback])
)
所以实际发生的是:
parallel
启动所有任务,然后等待[ , "Two"]
)["One", "Two"]
)undefined
(结果现为["One", "Two", undefined]
)parallel
注意到错误,立即返回到目前为止收到的结果series
解雇了第一项任务;它会安排超时。series
等待200ms之后调用回调,然后添加结果。 (结果现在是["One"]
)series
解雇第二项任务;它会安排超时。series
等待,直到100ms后调用回调,然后添加结果。 (结果现在是["One", "Two"]
)series
解雇第三项任务;它会安排超时。series
等待,直到400ms后调用回调,然后添加结果并因错误退出。 (结果现在是["One", "Two", undefined]
)您获得相同结果的事实是由于您在任务中依赖setTimeout
这一事实。
关于如何有效使用parallel
,请尝试使用parallel
下载一百个网页;然后对series
做同样的事情。看看会发生什么。
答案 1 :(得分:9)
正如您在文档中看到的那样:
运行一系列串联的函数,每个函数在前一个函数完成后运行。
这意味着异步将等待“n”函数在调用“n + 1”之前结束。
并行运行一系列函数,无需等到上一个函数完成。
但是你的代码太简单了,看不出差异。 如果它们都适合你,你应该选择async.parallel它会更快。