首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS +异步:选择哪个控制流选项?

NodeJS +异步:选择哪个控制流选项?
EN

Stack Overflow用户
提问于 2013-07-10 23:37:45
回答 2查看 283关注 0票数 1

如您所知,用这样的代码定义的async.parallel:

代码语言:javascript
运行
复制
async.parallel([
    function (callback) {
        callback(err, objects);
    },
    function (callback) {
        callback(err, status);
    },
    function (callback) {
        callback(err, status);
    },
], function (err, results) {
    //smth with results[N] array...
});

并行执行所有任务。但是,我需要第一个函数(确切地说,是objects)的回调结果才能在第二个和第三个函数中导航。换句话说,第一步函数,第二步- ( 2rd +3并行于第一步的结果)。async.waterfall似乎是个坏主意,因为:

  1. 瀑布中的函数不能并行工作
  2. 我不能访问堆栈的每个结果,只能访问最后一个结果。

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-07-11 03:32:42

你需要waterfallparallel

代码语言:javascript
运行
复制
function thing1(callback) {...callback(null, thing1Result);}
function thing2A(thing1Result, callback) {...}
function thing2B(thing1Result, callback) {...}
function thing2(thing1Result, callback) {
    async.parallel([
      async.apply(thing2A, thing1Result),
      async.apply(thing2B, thing1Result)
    ], callback);
}
async.waterfall([thing1, thing2], function (error) {
    //all done
});
票数 1
EN

Stack Overflow用户

发布于 2013-07-11 07:39:35

不需要使用异步。使用异步,您基本上是黑装箱您的应用程序。因为我不喜欢简单任务的魔力,香草js:

代码语言:javascript
运行
复制
var f1 = function (cb){
    ...
    cb (null, "result from f1"); //null error
};

var f2 = function (resultFromF1, cb){
    ...
    cb (null); //null error
};

var f3 = function (resultFromF1, cb){
    ...
    cb (null); //null error
};


var main = function (cb){
    f1 (function (error, resultFromF1){
        if (error) return cb ([error]);

        var errors = [];
        var remaining = 2;
        var finish = function (error){
            if (error) errors.push (error); 
            if (!--remaining){
                //f2 and f3 have finished
                cb (errors.length ? errors : null);
            }
        };

        f2 (resultFromF1, finish);
        f3 (resultFromF1, finish);
    });
};

main (function (errors){
    if (errors) return handleError (errors); //errors is an array
    ...
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17582744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档