使用async.js进行asynchronous树遍历

我试图使用async.js遍历一个嵌套的项目树。 遍历一个分支后,遍历终止。

var count=0; exports.buildFamily = function(item_id, mback){ var extendedFamily={}; exports.getItembyId(item_id, function(err, item){ extendedFamily=item; if(item.descendants){ extendedFamily.kids=[]; count=+item.descendants.length; console.log('outercount ' + count); async.eachSeries(item.descendants, function(item){ count-- console.log('item: ' + item) exports.buildFamily(item, function(err, family){ console.log('deepcount: ' + count); extendedFamily.kids.push(family); if(count===0){ return mback(null, extendedFamily);} else {extendedFamily.kids.push(family);} }) }) } else{ if(count===0){ return mback(null, extendedFamily);} else{ extendedFamily.kids.push(family); return; } } }); }; 

逻辑是相当复杂的,所以我会确保没有问题。 以下是您可能错过的一些事情。 计数+=就像前面提到的那样。 你的迭代器里面没有callback,你也是在extendedFamily.kids里面推家庭的两次。

 count += item.descendants.length; console.log('outercount ' + count); async.eachSeries(item.descendants, function(item, cb) { count--; console.log('item: ' + item); exports.buildFamily(item, function(err, family){ console.log('deepcount: ' + count); if(count===0){ return mback(null, extendedFamily);} else { extendedFamily.kids.push(family); cb(); } }) }) 

我误解了在async.js库中使用callback() 。 这篇文章帮助我了解: http : //www.sebastianseilund.com/nodejs-async-in-practice这是我的解决scheme:

 exports.buildFamily = function(item_id, done){ console.log('API:buildFamily'); var extendedFamily={} exports.getItembyId(item_id, function(err, item){ if(err){throw err} extendedFamily=item; if(item.descendants){ extendedFamily.kids=[] async.eachSeries(item.descendants, function(item_id, callback){ exports.getItembyId(item_id, function(err, item){ if(err){throw err} if(item.descendants){ exports.buildFamily(item.item_id, function(err, family){ extendedFamily.kids.push(family); callback(); }) }else{ extendedFamily.kids.push(item); callback(); } }) }, function(err){ done(null, extendedFamily) }) }else{ done(null, extendedFamily) } }); }