这是我的代码段。我试图获取我的friends.friendsList的详细信息驻留在用户集合本身,并在那里插入用户的ID。所以首先我提取userId
,然后获取他们的每个细节。但我的问题是我没有在friendsDetails
之外获得fetchDetailsfunction
的值。我试了很多次。我是节点和帆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 :(得分:0)
正如hlozancic所说,行为与预期一致。 User.findOne
查询是异步的,因此代码会在回调函数之后继续执行,因此console.log(friendsDetails)
函数之外的fetchDetails
会在内部任何函数之前调用。
作为解决方案,您不必使用findOne
来搜索多个用户;您可以使用标准find
根据您的搜索条件返回一组用户(例如,为了简单起见,也使用内置的.then()/.catch()
语法):
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);
})
}