2013-03-20 7 views
5

Başka bir sonuç kümesinde sonuç bulma sorgusunun sonuç kümesini kullanmak istiyorum. Bu durumu çok iyi açıklayamadım. Bazı kodları kullanmaya çalışacağım.NodeJS - iç içe geçmiş geri çağrılara bir değişken nasıl gönderilir? (MongoDB sorguları bulur)

People.find({ name: 'John'}, function(error, allJohns){ 
    for(var i in allJohns){ 
     var currentJohn = allJohns[i]; 
     Animals.find({ name: allJohns[i].petName }, allJohnsPets){ 
      var t = 1; 
      for(var j in allJohnsPets){ 
       console.log("PET NUMBER ", t, " = " currentJohn.name, currentJohn.surname, allJohnsPets[j].name); 
       t++; 
      } 
     } 
    } 
}); 

Öncelikle, ile tüm insanlar John adlandırılır bulmak olsun. Sonra bu insanları allJohns olarak kabul ediyorum.

İkincisi, her bir farklı evcil hayvanı tek tek farklı sorgularında buluyorum.

İkinci geri aramada, her evcil hayvanı birer birer tekrar alırım. Ama hangi John'un sahiplerinin olduğunu göstermek istediğimde, hep aynı John'la karşılaştım.

Yani, şu soru şudur: Her Yuvaya nasıl ikinci iç içe dönüşüme ayrı ayrı gönderebilirim ve gerçek sahipler ve evcil hayvanlar olarak birlikte olacaklar.

Her John'u kopyalamam gerekiyor ama bunu nasıl yapabileceğimi bilmiyorum.

+0

Yukarıdaki bir yazım hatası var mı? Animals.find() 'a ikinci arg olarak bir geriçağırım işlevi yazmayı mı unuttun? – ravi

cevap

5

Javascript'in blok kapsamı yoktur, yalnızca işlev kapsamı. Yerine for .. in .. arasında forEach kullanılarak her döngü için yeni bir kapsam yaratacaktır:

People.find({ name: 'John'}, function(error, allJohns){ 
    allJohns.forEach(function(currentJohn) { 
    Animals.find({ name: currentJohn.petName }, function(err, allJohnsPets) { 
     allJohnsPets.forEach(function(pet, t) { 
     console.log("PET NUMBER ", t + 1, " = ", currentJohn.name, currentJohn.surname, pet.name); 
     }); 
    }); 
    }); 
}); 
2

Sen asenkron doğasına daha konsantrasyon vermek zorunda.

People.find({ name: 'John'}, function(error, allJohns){ 
    for(var i=0; i<allJohns.length; i++){ 
    (function(currJohn){ 
     var currentJohn = currJohn; 
     Animals.find({ name: currentJohn.petName }, function(error, allJohnsPets){ 

      for(var j=0; j<allJohnsPets.length; j++){ 
     console.log("PET NUMBER ", (j+1), " = " currentJohn.name, currentJohn.surname, allJohnsPets[j].name); 
      } 
      }) 

     })(allJohns[i]); 
    } 
}); 
İlgili konular