2016-07-19 34 views
0

我有这样的代码:父的NodeJS功能的可调似乎超出范围在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; 
     } 
    }); 
} 

resundefined和我有点明白为什么,但什么是正确的做法能够在waterfall内使用res

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

另一种解决方案是将整个脚本制作为res全局,并且感觉不对。

编辑: res是不确定的只是在最后的递归调用,我不明白,也可以是一些res对象已经过期?我正在使用express框架,最后一次调用在60s后发生。

EDIT2:

这都是我的错,我打电话mainProcess也从功能之一,当年龄范围是不适合的。这打破了它。那是遗留下来的遗留代码。

+0

确切地说'res' undefined'?在'res.send(“Success:”+ status);'? –

+0

这里:'res.send(“Success:”+ status);' –

+0

然后通过'undefined'传递给'mainProcess'。如果'res'完全不可访问(事实并非如此),那么你会得到一个参考错误。 –

回答

1

除非有一个未示出的最后一个功能或新var res = delaration在同一个函数的参数名水库,水库是通过封闭

我看到正在未定义资源的唯一方法是对代码可见

if (ageOffset < 100){ 
    mainProcess(); 
} 

执行该递归调用mainProcess功能,而没有经过res变量,它在那个呼叫,如果你需要的递归调用和未定义

代码背后的逻辑改变如下

if (ageOffset < 100){ 
    mainProcess(res); // pass res again to mainProcess 
} 
+0

我已经尝试将'res'变量作为参数传递给我的想法,但它并没有帮助。 –

+0

@OndrejTokar然后在mainProcess res的初始调用是未定义的。有一个console.log语句测试, – eltonkamami

+0

会做,谢谢。 –

1

代码看起来绝对没问题。如果你在瀑布的最后回调中的瀑布&之前得到了重新印刷,它的未定义意味着它在中期得到改变。

确保没有你在哪里改变水库内的任何瀑布块或重新声明为VAR资源

如果您仍然遇到问题,请通过每个瀑布块级别进行调试(检查每个块中的res)。所以你可以得到它被替换的地方。

更新:

在最后的回调ATLEAST一次它应该打印水库正常。

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; 
    } 
+0

我已将该变量重命名为响应,以确保我不会在任何地方更改资源。没有帮助。任何建议? –

+0

你可以检查它是否在内部if block if(ageOffset <100 {mainProcess();} – jerry

+0

IGNORE THIS ONE:最新更新的一个注释,甚至是我第一次执行console.log时,我的res变量是未定义的。即使在我递归调用mainProcess之前, –