2015-10-09 14 views
7

async.jsを使用して項目のネストされたツリーをトラバースしようとしています。トラバーサルは、1つのブランチを通過した後に終了します。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; 
      } 
     } 
    }); 
}; 
+2

'= +' javascriptの加算代入演算子ではありません:これは私の解決策だったhttp://www.sebastianseilund.com/nodejs-async-in-practice :この記事は私が理解を得る助けました。 。 。 –

+0

そのミスからランタイムエラーが発生しましたか? –

答えて

0

私はasync.js図書館でcallback()の使用を誤解。

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) 
     } 
    }); 
} 
2

ロジックがかなり複雑であるため、最初は問題ありません。おそらく忘れてしまったことがいくつかあります。前述のように+=を数えます。あなたのイテレータの中にコールバックはなく、あなたはextendedFamily.kids内で家族を2回押していました。

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(); 
     } 
    }) 
}) 
関連する問題