Javascript NodeJs父函数变量在async.瀑布中似乎超出范围
我有这个密码:Javascript NodeJs父函数变量在async.瀑布中似乎超出范围,javascript,node.js,Javascript,Node.js,我有这个密码: function mainProcess(res) { async.waterfall([ function(callback) { postExportDefinition(requestParams, callback); }, function(requestParams, callback) { postSync(requestParams, callback);
function mainProcess(res) {
async.waterfall([
function(callback) {
postExportDefinition(requestParams, callback);
},
function(requestParams, callback) {
postSync(requestParams, callback);
},
function(requestParams, callback) {
checkSync(requestParams, callback);
},
function(body, callback) {
postUpdatedData(body, callback);
},
function(syncUri, callback) {
getSyncResponseInIntervals(syncUri, callback);
}
],
// the bonus final callback function
function(err, status) {
if (err) {
res.status(500)
.send({
error: "Error (best handling ever)"
});
return;
}
if (ageOffset < 100){
mainProcess();
}else{
res.send("Success: " + status);
console.log(status);
return;
}
});
}
函数主进程(res){
异步瀑布([
函数(回调){
postExportDefinition(请求参数、回调);
},
函数(requestParams、回调){
postSync(请求参数、回调);
},
函数(requestParams、回调){
checkSync(requestParams,回调);
},
函数(主体,回调){
postUpdateData(主体,回调);
},
函数(syncUri,回调){
getSyncResponseInIntervals(syncUri,回调);
}
],
//最后一个回调函数
功能(错误、状态){
如果(错误){
资源状况(500)
.发送({
错误:“错误(有史以来最佳处理)”
});
返回;
}
如果(年龄偏移<100){
mainProcess();
}否则{
res.send(“成功:+状态”);
控制台日志(状态);
返回;
}
});
}
res
是未定义的
,我有点理解为什么,但是在瀑布中使用res
的正确方法是什么
一种解决方案是在所有函数和所有回调中传递变量,但这根本不可伸缩,我讨厌这种解决方案。这是唯一的一个吗
另一个解决方案是使整个脚本的res全局化,这同样让人感觉不对劲
编辑:
res
仅在最后一次递归调用中未定义,我不明白这可能是res
对象已过期的原因吗?我正在使用express
framework,最后一次调用发生在60秒后
EDIT2:
这都是我的错,当年龄范围不合适时,我也从一个函数调用了mainProcess
。这打破了它。这是遗留下来的一些旧代码。除非上一个函数中没有显示参数名res,或者同一个函数中有一个新的var res=
delaration,否则res通过闭包可见
我看到res未定义的唯一方式是
if (ageOffset < 100){
mainProcess();
}
除非最后一个函数中没有显示参数名res,或者同一个函数中有新的var res=
delaration,否则res通过闭包可见
我看到res未定义的唯一方式是
if (ageOffset < 100){
mainProcess();
}
代码看起来非常好。如果您在瀑布之前打印res&在瀑布的最终回调中,它的未定义意味着它在中间被更改
确保在任何瀑布块内更改res或重新声明为var res的位置都不存在
如果仍然存在问题,则按每个瀑布块级别进行调试(检查每个块中的res)。这样你就可以在哪个地方找到它被替换的位置
更新:
在最后一次回调中,至少应正确打印一次res
function(err, status) {
//Here it should print once at least
console.log(res);
if (err) {
...
}
if (ageOffset < 100){
//here u r making res undefined for the next call. Since its not passed. If u pass it will still work
mainProcess();
}else{
res.send("Success: " + status);
console.log(status);
return;
}
功能(错误、状态){
//在这里,它应该至少打印一次
控制台日志(res);
如果(错误){
...
}
如果(年龄偏移<100){
//在这里,你正在为下一个调用设置未定义的res。因为它没有通过。如果你通过,它仍然可以工作
mainProcess();
}否则{
res.send(“成功:+状态”);
控制台日志(状态);
返回;
}
代码看起来非常好。如果您在瀑布之前打印res&在瀑布的最终回调中,它的未定义意味着它在中途被更改
确保在任何瀑布块内更改res或重新声明为var res的位置都不存在
如果您仍然遇到问题,则按每个瀑布块级别对其进行调试(检查每个块中的res)。这样,您就可以得到被替换的位置
更新:
在最后一次回调中,至少应正确打印一次res
function(err, status) {
//Here it should print once at least
console.log(res);
if (err) {
...
}
if (ageOffset < 100){
//here u r making res undefined for the next call. Since its not passed. If u pass it will still work
mainProcess();
}else{
res.send("Success: " + status);
console.log(status);
return;
}
功能(错误、状态){
//在这里,它应该至少打印一次
控制台日志(res);
如果(错误){
...
}
如果(年龄偏移<100){
//在这里,你正在为下一个调用设置未定义的res。因为它没有通过。如果你通过,它仍然可以工作
mainProcess();
}否则{
res.send(“成功:+状态”);
控制台日志(状态);
返回;
}
res未定义的确切位置在res.send(“成功:”+状态);
?此处:res.send(“成功:”+状态);
然后将未定义的传递到主进程
。如果res
根本无法访问(情况并非如此),那么您将得到一个引用错误。不是真的,如果我将res
变量设为全局变量,它就可以正常工作。除非最后一个函数中没有显示参数名res,或者同一个函数中有一个新的var res=
delaration,否则res可以通过closure看到,而r中的res
未定义的es.send(“成功:”+状态);
?此处:res.send(“成功:”+状态);
然后将未定义的传递给mainProcess
。如果res
根本无法访问(情况并非如此),那么您将得到一个引用错误。不是真的,如果我将res
变量设置为全局变量,它就可以正常工作。除非上一个函数中没有显示参数名res,或者同一个函数中有一个新的var res=
delaration,否则res可以通过closure显示。我已尝试将res
变量作为参数准确地传递很奇怪,当我在回调函数中记录res对象时,它说它是未定义的。但是当我在调用瀑布之前记录它时,它显示了obje