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