2016-07-19 33 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之前, –