[英]Skip to main callback with result in async waterfall node js
是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。 也向主后衛發送響應作為參數。
不要使用返回/拋出錯誤來控制執行流程,這是代碼的味道。
而是按以下方式重構代碼:
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
分支。
我建議也閱讀以下內容: http : //fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/
跳過其余瀑布的唯一方法是傳遞err參數。
因此,調用: done({ something: { val: 1 }})
會跳過其余的瀑布。
如果這不是真正的錯誤,則可以將要解析的某些對象放在錯誤中,而不是錯誤,但它將作為結果回調( mainCallback
)中的第一個參數傳遞。
function func1 (something, res, callback) {
if (something == 0) {
callback (null, res, somethingelse);
} else {
callback({val:1});
}
}
但是,是的,您不應該使用錯誤來控制流或打破異步。 它僅應用於傳播錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.