2016-06-22 1 views
0

Voici mon extrait de code. J'essaye d'obtenir des détails de mes amis. La liste d'amis est dans la collection d'utilisateurs elle-même et là j'insère l'identification des utilisateurs. Donc d'abord je vais chercher userId, puis aller chercher chacun de leurs détails. Mais mon problème est que je ne reçois pas les valeurs de friendsDetails en dehors du fetchDetailsfunction. J'ai essayé beaucoup de temps. je suis nouveau au noeud et aux voiles js. Je pense à son problème d'exécution asynchrone. Comment puis-je résoudre ce problème? Comme l'a dit hlozancic, le comportement est tout à fait conforme à la norme deCode en dehors de la boucle d'exécution avant l'exécution dans node.js

getFriendsDetails:function(req,res){ 
     var userId = req.param('id'); 
     var friendsDetails=[]; 
     User.findOne({ 
      id: userId 
     }).exec(function(err,user){ 
      var friendsIds=user.friends; 
      friendsIds.forEach(function(id){ 

       User.findOne({ 
         id: id 
        }).exec(function fetchDetails(err,Userdetails){ 

         var obj={ 
          id:Userdetails.id, 
          name:Userdetails.name, 
          pro_pic:Userdetails.profile_pic 
         } 
         friendsDetails.push(obj); 

         console.log(friendsDetails);//Here consoling pushed data correctly. 

        }); 
        console.log(friendsDetails);//here i am getting null array 


      }); 
     }); 
+0

Ce comportement est normal. Lisez un peu ici pour en savoir plus sur les bases: https://www.codementor.io/nodejs/tutorial/manage-async-nodejs-callback-example-code – hlozancic

Répondre

0

Les requêtes User.findOne sont asynchrones, donc le code continue à s'exécuter sur la ligne après votre fonction de rappel, donc le console.log(friendsDetails) en dehors de votre fonction fetchDetails est appelé avant l'un de ceux à l'intérieur.

En tant que solution, vous n'avez pas besoin d'utiliser findOne pour rechercher plusieurs utilisateurs; vous pouvez utiliser un find standard qui retourne un tableau d'utilisateurs en fonction de vos critères de recherche, comme celui-ci (également en utilisant le haut-.then()/.catch() syntaxe pour simplifier):

getFriendsDetails : function(req, res) { 
    var userId = req.param('id'); 
    var friendsDetails = []; 
    User.findOne({ 
     id: userId 
    }) 
    .then(function(user) { 
     var friendsIds = user.friends; 
     return User.find({ 
      id: friendsIds 
     }) 
    }) 
    .then(function(users) { 
     users.forEach(function(friend) { 
      friendsDetails.push({ 
       id: friend.id, 
       name: friend.name, 
       pro_pic: friend.profile_pic     
      }) 
     }) 
     console.log(friendsDetails); // Should log list of friend details 
    }) 
    .catch(function(err) { 
     console.log("Error!", err); 
    }) 
}