最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

async.series和async.parallel之间的区别

运维笔记admin9浏览0评论

async.series和async.parallel之间的区别

async.series和async.parallel之间的区别

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函数:

如果任何函数将错误传递给其回调,则会立即使用错误值调用主回调

async.parallel中的主要回调是什么?

回答如下:

async.series以串行方式调用您的函数(在开始下一个之前等待前面的每个函数完成)。 async.parallel将同时发射它们(或者无论如何在同一个线程中同时发射任何通行证)。

主回调是在调用async.parallelasync.series时可选择的回调(签名是async.parallel(tasks, [callback])

那么实际发生的是:

平行:

  • parallel启动所有任务,然后等待
  • 所有四项任务都会安排超时
  • 超时100次火灾,添加其结果(结果现在是[ , "Two"]
  • 超时200次火灾,添加其结果(结果现在是["One", "Two"]
  • 超时400次火灾,返回错误和undefined结果(结果现在是["One", "Two", undefined]
  • parallel注意到错误,立即返回到目前为止收到的结果
  • 超时600火灾,但没有人关心返回结果

系列:

  • series解雇了第一项任务;它会安排超时。
  • series等待,直到200ms之后调用回调,然后添加结果。 (结果现在是["One"]
  • series发射第二项任务;它会安排超时。
  • series等待,直到100ms后调用回调,然后添加结果。 (结果现在是["One", "Two"]
  • series解雇了第三项任务;它会安排超时。
  • series等待,直到400ms后调用回调,然后添加结果并由于错误退出。 (结果现在是["One", "Two", undefined]
  • 永远不会执行第四个任务,并且永远不会安排其超时。

您获得相同结果的事实是由于您在任务中依赖setTimeout这一事实。

至于如何有用地使用parallel,尝试用parallel下载一百个网页;然后用series做同样的事情。走着瞧吧。

发布评论

评论列表(0)

  1. 暂无评论