簡體   English   中英

嵌套Async.Waterfall()函數中的Node.js回調

[英]Node.js Callbacks in Nested Async.Waterfall() functions

我正在嘗試在另一個使用async.waterfall()的函數中運行一個使用async.waterfall()的命名函數。

回調應該如何構造,以便將內部函數的輸出傳遞給外部函數?

以下代碼不使用嵌套的異步代碼,並且可以正常工作:

//nested_async_1.js

var async = require("async");

console.log("Script running");

// Inner function, to be called by the outer function
var InnerAsync = function(callback_inner_async) {

    async.waterfall([
        function (callback) {
            console.log("Inner function 1");
            callback(null, "results 1")
        },

        function (input_1, callback){
            console.log("function 2 " + input_1);
            callback(null, "results 2")
        }
    ],
    function (err, final_result) {
        if (err) {
            console.log("Server error: ", err);
            callback(err)
        }
        else{
            var return_val = "Final result " + final_result;
            console.log(return_val);
            callback_inner_async(return_val);
        }
    });
};


// Outer function
InnerAsync(function(result){
    console.log("Outer function " + result);
});

輸出量

C:\Data\>node nested_async_1.js  
Script running  
Inner function 1  
function 2 results 1  
Final result results 2  
Outer function Final result results 2  

雖然以下嵌套的異步代碼無法運行:

//nested_async_2.js

var async = require("async");

console.log("Script running");

// Inner function, to be called by the outer function
var InnerAsync = function(callback_inner_async) {

    async.waterfall([
        function (callback) {
            console.log("Inner function 1");
            callback(null, "results 1")
        },

        function (input_1, callback){
            console.log("function 2 " + input_1);
            callback(null, "results 2")
        }
    ],
    function (err, final_result) {
        if (err) {
            console.log("Server error: ", err);
            callback(err)
        }
        else{
            var return_val = "Final result " + final_result;
            console.log(return_val);
            callback_inner_async(return_val);
        }
    });
};

// Outer function, which calls the inner function
async.waterfall([
    function(callback_outer){
        console.log("Outer function 1");
        callback_outer(null, "Outer result 1")
    },
    function(input_1, callback_outer){
        console.log("Outer function 2");
        // Run the inner function, and get the results
        // How should this be structured???
        callback_outer(null, InnerAsync())
    }
],
    function(err, final_outer_result){
        if(err){
            console.log("Error on outer function: " + err)
        }
        else {
            console.log("Final outer function");
            console.log(final_outer_result);
        }
    }
);

輸出量

C:\\ Data>節點nested_async_2.js
腳本運行
外功能1
外功能2
內部功能1
功能2結果1
最終外部功能
未定義
最終結果結果2
C:\\ Data \\ nested_async_2.js:31
callback_inner_async(return_val);
^

TypeError:callback_inner_async不是一個函數
在C:\\ Data \\ nested_async_2.js:31:13
在C:\\ Data \\ node_modules \\ async \\ lib \\ async.js:52:16
在即時._onImmediate(C:\\ Data \\ node_modules \\ async \\ lib \\ async.js:1201:34)
在processImmediate [as _immediateCallback](timers.js:374:17)

代替

function(input_1, callback_outer){
    console.log("Outer function 2");
    // Run the inner function, and get the results
    // How should this be structured???
    callback_outer(null, InnerAsync())
}

它應該是

function(input_1, callback_outer){
    console.log("Outer function 2");
    InnerAsync(function(result) {
        console.log("Result from InnerAsync: ", result);
        callback_outer(null, result);
    });
}

按照預期工作。 nested_async_2.js ,您可以調用InnerAsync而不進行回調,因此在嘗試調用它時會失敗。

InnerAsync錯誤處理也存在一些問題。 該函數不遵循error-first callback模式,因此,代碼將在這些行上失敗

function (err, final_result) {
    if (err) {
        console.log("Server error: ", err);
        callback(err) // will fail here
    }

(如果發生錯誤),因為未在其中定義callback

我認為您在調用InnerAsync時沒有任何參數。 因此,在調用InnerAsync時,您沒有傳遞回調函數callback_inner_async ,即收到錯誤。

嘗試這個:

async.waterfall([
    function(callback_outer){
        console.log("Outer function 1");
        callback_outer(null, "Outer result 1")
    },
    function(input_1, callback_outer){
        console.log("Outer function 2");

        // Call InnerAsync with the callback function

        InnerAsync(callback_outer);
    }
],
    function(err, final_outer_result){
        if(err){
            console.log("Error on outer function: " + err)
        }
        else {
            console.log("Final outer function");
            console.log(final_outer_result);
        }
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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