是Node JS的新手,并且正在使用异步瀑布。

var methods = function (req, res) {
async.waterfall([
    func1(req, res),
    func2,
    func3
], mainCallback);
};

app.get("/create", function(request, response)
{
  methods(request, response);
});

function func1 (something, res, callback) {
    if(something == 0)
    {
     callback (null, res, somethingelse);
    }
    else
    {
     mainCallback("success");
     }

}

function func2 (something, res, callback) {
      callback (null, res, somethingmore);
}

function func3 (something, res, callback) {
      callback (null, res, somethingmore);
}

function mainCallback (error, success)
{
 if (error)
{
    console.log("error");
}

if(success)
{
    //console.log("success");
}

}


在上面的流程中,能够跳至带结果的主回调,但无法向主回调发送更多参数。

例如,如果我想从主回叫发送响应,那么如何从func1将其作为参数发送呢?

我在func1中尝试了以下操作,但没有用

mainCallback("success", response)


请让我知道如何跳过方法func2和func3。还发送响应作为主要Allback的参数。

最佳答案

不要使用返回/抛出错误来控制执行流程,这是代码的味道。

而是按以下方式重构代码:

function mainCallback(err, res) {
    if (err) {
        console.log(err);
    } else {
        console.log(res);
    }
}

function routeHandler(req, res) {
    func1(req, res, function(err, res) {
        if (res.something === 0) {
            async.waterfall([
                func2,
                func3
            ], mainCallback)
        } else {
            mainCallback(null, 'success')
        }
    })
}

app.get('/create', routeHandler());


请注意,在调用mainCallback时,我将第一个值传递为null,这样做是为了遵守错误约定,因此,在调用mainCallback且第一个参数具有一个值时,我确定它是错误的,否则第二个参数应包含结果。

同样,这将使您的代码更易读和更容易理解,因为您在if中显式具有func1分支。

我建议也阅读以下内容:http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/

07-24 09:32