跳转到主回调,结果是异步瀑布节点js

时间:2015-12-29 07:46:31

标签: javascript node.js asynchronous

是节点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。

2 个答案:

答案 0 :(得分:1)

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

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

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/

答案 1 :(得分:0)

跳过其余瀑布的唯一方法是传入错误的参数。

所以打电话:done({ something: { val: 1 }})会跳过其余的瀑布。

如果它确实不是一个错误,你可以在最终回调中放置一些你要解析的对象,而不是错误,但它会作为结果回调中的第一个参数传递(mainCallback)。 / p>

function func1 (something, res, callback) {
    if (something == 0) {
        callback (null, res, somethingelse);
    } else {
        callback({val:1});
    }
}

修改

但是,是的,你不应该使用错误来控制流量或打破异步。它应该仅用于传播错误。