簡體   English   中英

跳到主回調並產生異步瀑布結點js

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM