NodeJs父函数变量似乎超出了async.waterfall的范围

时间:2016-07-19 09:36:08

标签: javascript node.js

我有这段代码:

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;
        }
    });
 }

resundefined,我有点理解为什么,但在res中使用waterfall的正确方法是什么?

一种解决方案是在所有函数和所有回调中传递变量,但这根本不可扩展,我讨厌这样的解决方案。它是唯一的吗?

另一种解决方案是使整个脚本的res全局化,再次感觉不对。

修改 res仅在最后一次递归调用中未定义,我不明白它是res对象已过期的东西吗?我正在使用express框架,最后一次调用发生在60年代之后。

EDIT2:

这完全是我的错,当年龄范围不合适时,我也从其中一个功能中调用mainProcess。打破了它。这是剩下的遗留代码。

2 个答案:

答案 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;
    }