2015-10-09 85 views
7

Próbuję przejść przez drzewo zagnieżdżonych elementów przy użyciu pliku async.js. Przejście kończy się po przejściu przez jedną gałąź.Asynchroniczne przechodzenie drzewa za pomocą 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

'' = + nie jest javascript operator przypisania dodatkiem. . . –

+0

Czy właśnie otrzymałeś błąd runtime od tego błędu, a następnie? –

Odpowiedz

0

ja źle zastosowanie callback() w bibliotece async.js. Ten artykuł bardzo mi pomógł uzyskać zrozumienie: http://www.sebastianseilund.com/nodejs-async-in-practice To było moje rozwiązanie:

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

Logika jest dość skomplikowana, więc upewnię się, że wszystko jest w porządku. Oto kilka rzeczy, które prawdopodobnie przegapiłeś. policzyć += jak wcześniej wspomniano. Wewnątrz iteratora nie ma oddzwaniania, a Ty dwukrotnie przesuwałeś rodzinę do 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(); 
     } 
    }) 
})