2016-06-22 4 views
0

Hier ist mein Code-Snippet. Ich versuche, Details meiner Freunde zu erhalten. Freunde-Liste ist innerhalb der Benutzersammlung selbst und dort bin ich Benutzer ID einfügen. Also zuerst ich hole userId, dann holen jedes ihrer details.aber mein Problem ist, dass ich nicht die Werte friendsDetails außerhalb der fetchDetailsfunction bekomme. Ich habe es viele Mal versucht. Ich bin neu zu Knoten und Segel js. Ich denke sein Problem der asynchronen Ausführung. Wie kann ich dieses Problem lösen?Code außerhalb in for Schleife Ausführung vor der Ausführung in 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

Dies ist ein normales Verhalten. Lesen Sie hier ein wenig über Grundlagen: https://www.codementor.io/nodejs/tutorial/manage-async-nodejs-callback-example-code – hlozancic

Antwort

0

Wie hlozancic sagte, ist das Verhalten wie erwartet. Die User.findOne Abfragen sind asynchron, so dass der Code weiterhin auf der Leitung nach Ihrer Callback-Funktion ausgeführt wird, so dass die console.log(friendsDetails) außerhalb Ihrer fetchDetails Funktion aufgerufen wird, bevor einer von denen auf der Innenseite.

Als Lösung müssen Sie findOne nicht verwenden, um nach mehreren Benutzern zu suchen; Sie können eine Standard-find verwenden, die zu Ihren Suchkriterien eine Reihe von Benutzern zurückgibt basiert, wie diese (auch die eingebaute in .then()/.catch() Syntax der Einfachheit halber verwendet wird):

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); 
    }) 
} 
Verwandte Themen