2017-09-27 47 views
0

任務:我需要遍歷一個json對象並對鍵進行某些更改。我將處理不同深度和不同尺寸的物體。當函數擊中其值爲對象的鍵時,將在該對象上再次調用該鍵。帶回調的Node.js異步遞歸函數

問題1.:作爲一個同步函數,我注意到大的json對象返回的不完整。使用異步庫,async.forEach解決處理長期的任務,完成後僅歸還問題,但...

問題2::看來異步功能喪失併發時,它被遞歸調用(?) (在代碼片段中指出)。

爲了測試這個想法,我刪除了遞歸函數調用,它工作(但沒有遞歸),並且我得到了一個回調函數。當我添加函數調用時,我得到TypeError: results is not a function

這使我認爲異步與回調遞歸函數不會混合在節點中。有兩種方法可以實現嗎?

可行解決:我可以運行一個單獨的函數來計算所有的按鍵,並使用一個計數器作爲我的控制在一個簡單的for循環,而不是讓forEach處理控制。這似乎有點低效,不是嗎?

下面的代碼:

function fixJsonKeys(obj, results) { 
 

 
    async.forEach(Object.keys(obj), function(key, callback) { 
 

 
     if (typeof obj[key] == 'object') { 
 
       
 
      // do stuff to json key, then call the function 
 
      // on the nested object 
 
      
 
      fixJsonKeys(obj[key]); 
 

 
      callback(); // <-- how does this work with recursion?? 
 

 
     } 
 

 
     else { 
 
      
 
      // do stuff to json key 
 

 
      callback(); 
 
     } 
 

 
    }, function(err) { 
 

 
     if (err) return next(err); 
 
     
 
     // obj keys fixed, now return completed object 
 

 
     results(obj); 
 

 
    }); 
 
}

編輯:很難在評論格式,因此:

@Laksh和@Suhail:我想你的建議和相同的結果。如果我從if條件中刪除回調,async.forEach仍然會確認它已處理頂級密鑰(我認爲)。

例如,假設我有3個頂級鍵,其中一人有一個嵌套的對象:

[key1] (no callback, do recursion) 

    --[subKey1] 
    --[subKey2] 

[key2] (callback) 

[key3] (callback) 

async.forEach仍在尋找採取key1的行動回調。我有這個正確嗎?

+0

你只能在遞歸的基礎情況下回調 –

+0

只要在if區塊 –

+0

@Queenqueg中的遞歸調用後刪除'callback','fixJsonKeys'的輸入是什麼樣子?預期產出是多少? – naomik

回答

0

由於您在這裏使用遞歸函數,因此您不需要在if條件中調用callback()

這是因爲如果整個遞歸堆棧針對特定的obj[key]完成,您的遞歸調用將返回到現有的callback()中。

遞歸函數只在基本條件爲真時返回,在您的情況下,如果條件失敗,它會自動從else塊中調用callback()