繁体   English   中英

NodeJ的父函数变量在async.waterfall中似乎超出范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM