Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJs父函数变量在async.瀑布中似乎超出范围_Javascript_Node.js - Fatal编程技术网

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