2017-09-27 49 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()