Node.js 嵌套 Async.Waterfall() 函数中的回调
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
在 Immediate._onImmediate (C:\Data\node_modules\async\lib\async.js:1201:34)
在 processImmediate [as _immediateCallback] (timers.js:374:17)
我认为您在调用 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);
}
}
);
而不是
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
。
我正在尝试 运行 一个使用 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
在 Immediate._onImmediate (C:\Data\node_modules\async\lib\async.js:1201:34)
在 processImmediate [as _immediateCallback] (timers.js:374:17)
我认为您在调用 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);
}
}
);
而不是
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
。