[英]NodeJs parent function variable appears to be out of scope in async.waterfall
我有以下代码:
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
undefined
,我有点理解为什么,但是在waterfall
内使用res
的正确方法是什么?
一种解决方案是将变量传递到所有函数和所有回调中,但这一点根本不可扩展,我讨厌这种解决方案。 是唯一的吗?
同样,另一种解决方案是使整个脚本的全局资源都不正确。
编辑: res
仅在上一次递归调用中才是未定义的,我不知道它可以是res
对象已过期的东西吗? 我使用的是express
框架,最近一次通话发生在60年代之后。
编辑2:
都是我的错,当年龄段不合适时,我也从其中一个函数调用了mainProcess
。 那打破了它。 那是一些遗留的遗留代码。
除非最后一个函数中有未显示的参数名称res或同一函数中有新的var res =
delaration,否则res通过闭包可见
我看到res未定义的唯一方法是代码
if (ageOffset < 100){
mainProcess();
}
执行递归调用mainProcess函数,而不传递res
变量,该变量在该调用上将是未定义的
如果您需要递归调用,并且代码台背后的逻辑按如下所示进行更改
if (ageOffset < 100){
mainProcess(res); // pass res again to mainProcess
}
代码看起来绝对不错。 如果在瀑布和瀑布的最终回调之前获得打印的分辨率,则其undefined表示其在中间被更改。
确保没有在那里你正在改变中的任何瀑布块的资源或重新声明为VAR资源 。
如果仍然遇到问题,请按每个瀑布图块级别对其进行调试(检查每个图块中的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.