是节点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。
答案 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});
}
}
但是,是的,你不应该使用错误来控制流量或打破异步。它应该仅用于传播错误。