我有这段代码:
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
,我有点理解为什么,但在res
中使用waterfall
的正确方法是什么?
一种解决方案是在所有函数和所有回调中传递变量,但这根本不可扩展,我讨厌这样的解决方案。它是唯一的吗?
另一种解决方案是使整个脚本的res全局化,再次感觉不对。
修改
res
仅在最后一次递归调用中未定义,我不明白它是res
对象已过期的东西吗?我正在使用express
框架,最后一次调用发生在60年代之后。
EDIT2:
这完全是我的错,当年龄范围不合适时,我也从其中一个功能中调用mainProcess
。打破了它。这是剩下的遗留代码。
答案 0 :(得分:1)
除非在最后一个未显示的函数中存在参数名称res或在同一函数中有新的var res =
延迟,否则通过闭包可以看到res
我认为res未定义的唯一方法是
上的代码if (ageOffset < 100){
mainProcess();
}
执行以递归方式调用mainProcess函数而不传递res
变量,该变量在该调用中将是未定义的
如果您需要递归调用并且代码后面的逻辑将其更改如下
if (ageOffset < 100){
mainProcess(res); // pass res again to mainProcess
}
答案 1 :(得分:1)
代码看起来非常好。如果你在瀑布之前得到印刷品和在瀑布的最终回调中,未定义意味着它在中期发生了变化。
确保不在任何位置更改任何瀑布块中的 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;
}