任务:我需要遍历一个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