2013-03-20 2 views
5

Я хочу использовать набор результатов поиска в другом результирующем наборе. Я не мог объяснить эту ситуацию на английском языке очень хорошо. Я попытаюсь использовать какой-то код.NodeJS - как отправить переменную вложенные обратные вызовы? (MongoDB найти запросы)

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

Во-первых, я получаю все люди с найти, которые по имени Джон. Затем я беру этих людей как allJohns.

Во-вторых, я получаю всех домашних животных каждого Джона один за другим в разных найти запросов.

Во втором обратном вызове я получаю каждое домашнее животное один за другим. Но когда я хочу показать, какой Джон их владельцы, у меня всегда был тот же Джон.

Итак, вопрос: как я могу отправить каждого Джона отдельно во второй вложенный обратный вызов, и они будут вместе как настоящие владельцы и домашние животные.

Мне нужно скопировать каждого Джона, но я не знаю, как это сделать.

+0

Есть ли опечатка в вышеперечисленном? Вы имели в виду и забыли написать функцию обратного вызова, как второй аргумент для Animals.find()? – ravi

ответ

5

Javascript не имеет области видимости блока, только функция scope. Вместо for .. in .., используя forEach создаст новые возможности для каждого цикла:

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

Вы должны дать больше концентрации на асинхронной природы.

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]); 
    } 
}); 
Смежные вопросы