2015-10-09 9 views
7

Ich versuche, einen Baum der verschachtelten Elemente mit async.js durchqueren. Die Durchquerung wird beendet, nachdem nur ein Zweig durchlaufen wurde.Asynchrone Baum Traversal mit 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

'= +' ist nicht der JavaScript-Additionszuweisungsoperator. . . –

+0

Haben Sie gerade einen Laufzeitfehler von diesem Fehler bekommen? –

Antwort

0

ich falsch verstanden die Verwendung des callback() in der async.js Bibliothek. Dieser Artikel hat mir geholfen, ein Verständnis zu bekommen: http://www.sebastianseilund.com/nodejs-async-in-practice Dies war meine Lösung:

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

Die Logik ist ein bisschen gewunden, so würde ich dafür sorgen, dass die erste Ordnung. Hier sind ein paar Dinge, die Sie wahrscheinlich verpasst haben. Zählung += wie zuvor erwähnt. Kein Callback in deinem Iterator und du hast die Familie auch zweimal in extendedFamily.kids gedrängt.

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