Javascript 跳到主回调,结果是异步瀑布节点js
我是NodeJS新手,正在使用异步瀑布Javascript 跳到主回调,结果是异步瀑布节点js,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我是NodeJS新手,正在使用异步瀑布 var methods = function (req, res) { async.waterfall([ func1(req, res), func2, func3 ], mainCallback); }; app.get("/create", function(request, response) { methods(request, response); }); function func1 (somethin
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");
}
}
在上面的流程中,我可以跳转到带有结果的主回调,但无法向主回调发送更多参数
例如,如果我想从main回调发送响应,那么如何将其作为func1的参数发送
我在func1中尝试了以下操作,但无效
mainCallback("success", response)
请告诉我如何跳过方法func2和func3。还将响应作为参数发送给main allback。跳过瀑布其余部分的唯一方法是传入err参数 所以调用:
done({something:{val:1}}})
将跳过瀑布的其余部分
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");
}
}
如果它不是一个真正的错误,您可以将要在最终回调中解析的某个对象作为错误放入,但它将作为结果回调中的第一个参数传递(mainCallback
)
编辑
但是,是的,您不应该使用错误作为控制流或中断异步的方法。它应该只用于传播错误。跳过瀑布其余部分的唯一方法是传入err参数 所以调用:
done({something:{val:1}}})
将跳过瀑布的其余部分
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");
}
}
如果它不是一个真正的错误,您可以将要在最终回调中解析的某个对象作为错误放入,但它将作为结果回调中的第一个参数传递(mainCallback
)
编辑
但是,是的,您不应该使用错误作为控制流或中断异步的方法。它应该只用于传播错误。不要使用返回/抛出错误来控制执行流,这是一种代码味道 而是按照如下方式重构代码:
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并且第一个参数有一个值时,我就确定这是一个错误,否则第二个参数应该包含结果
此外,这将使代码更易于阅读和理解,因为在func1
中有一个if
分支
我建议也读一下:不要使用返回/抛出错误来控制执行流,这是一种代码味道 而是按照如下方式重构代码:
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并且第一个参数有一个值时,我就确定这是一个错误,否则第二个参数应该包含结果
此外,这将使代码更易于阅读和理解,因为在func1
中有一个if
分支
我建议您也读一读:谢谢您的快速回复。我在func1 done({value:1})中这样尝试过;但它显示未定义完成。@itdeeps我使用了
done
作为回调参数名称的示例(通常使用的名称是:cb
,next
,done
,callback
)。我已经更新了答案。永远不要返回/抛出错误/异常来控制执行流。@edin我很抱歉我的错误。。我认为这是一种预先定义的方法。好的,正如您和nvartolomei提到的,没有办法向主回调添加额外的参数。好的,让我试试。谢谢你最快的回复。我在func1 done({value:1})中这样尝试过;但它显示未定义完成。@itdeeps我使用了done
作为回调参数名称的示例(通常使用的名称是:cb
,next
,done
,callback
)。我已经更新了答案。永远不要返回/抛出错误/异常来控制执行流。@edin我很抱歉我的错误。。我认为这是一种预先定义的方法。好的,正如您和nvartolomei提到的,没有办法向主回调添加额外的参数。好的,让我试试……谢谢你的回复。事实上,我已经补充说,如果只是一个例子。实际上,我在每个回调中执行DB调用,并决定做什么。。无论如何,谢谢你的链接。。让我尝试在第二个参数中发送响应数据。谢谢您的响应。事实上,我已经补充说,如果只是一个例子。实际上,我在每个回调中执行DB调用,并决定做什么。。无论如何,谢谢你的链接。。让我尝试在第二个参数中发送响应数据。。