任務:我需要遍歷一個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的行動回調。我有這個正確嗎?
你只能在遞歸的基礎情況下回調 –
只要在if區塊 –
@Queenqueg中的遞歸調用後刪除'callback','fixJsonKeys'的輸入是什麼樣子?預期產出是多少? – naomik