2015-10-09 10 views
7

Tôi đang cố gắng duyệt qua một cây lồng nhau các mục bằng cách sử dụng async.js. Traversal chấm dứt sau khi đi qua chỉ một chi nhánh.Di chuyển cây không đồng bộ bằng cách sử dụng 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

'= +' không phải là toán tử gán Ngoài javascript. . . –

+0

Bạn có gặp phải lỗi thời gian chạy từ sai lầm đó không? –

Trả lời

0

Tôi hiểu sai việc sử dụng callback() trong thư viện async.js. Bài viết này đã giúp tôi có được một sự hiểu biết: http://www.sebastianseilund.com/nodejs-async-in-practice Đây là giải pháp của tôi:

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

Logic khá phức tạp nên tôi chắc chắn rằng điều đó tốt trước. Đây là một vài điều mà bạn có thể bỏ qua. đếm += như đã đề cập trước đây. Không có gọi lại bên trong iterator của bạn và bạn cũng đã đẩy gia đình bên trong extendFamily.kids hai lần.

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(); 
     } 
    }) 
}) 
Các vấn đề liên quan