这是我的代码:
server.get(url_prefix + '/user/:user_id/photos', function(req, res, next) {
if (!req.headers['x-session-id']) {
res.send({
status: {
error: 1,
message: "Session ID not present in request header"
}
})
} else {
User.findOne({
session_id: req.headers['x-session-id']
}, function(err, user) {
if (user) {
var user_id = req.params.user_id
Album.find({userId : user_id})
.populate('images')
.exec(function (err, albums) {
if (albums) {
albums.forEach(function(album, j) {
var album_images = album.images
album_images.forEach(function(image, i) {
Like.findOne({imageID : image._id, userIDs:user._id}, function(err,like){
if(like){
albums[j].images[i].userLike = true;
}
})
})
})
return res.send({
status: {
error: 0,
message: "Successful"
},
data: {
albums: albums
}
})
} else
return notify_error(res, "No Results", 1, 404)
})
}
else {
res.send({
status: {
error: 1,
message: "Invalid Session ID"
}
})
}
})
}
})
我正在尝试向我的图像数组添加一个额外的值 (albums[j].images[i].userLike = true;
),该数组位于相册数组内。
问题是return res.send({
在我们从foreach获得响应之前发送数据
如何才能使其工作,以便仅在 foreach 完成所有迭代后才发生 return
您必须等待调用 res.send
,直到获取每个相册中所有图像的所有点赞。例如
var pendingImageLikes = album_images.length;
album_images.forEach(function(image, i) {
Like.findOne({imageID : image._id, userIDs:user._id}, function(err,like){
if (like) {
albums[j].images[i].userLike = true;
}
if (!--pendingImageLikes) {
// we fetched all likes
res.send(
// ...
);
}
});
您可能需要 album_images.length === 0
的特殊情况。
此外,这并没有考虑到您有多个相册,每个相册都有多个图像。您必须以非常相似的方式延迟 res.send
才能使其真正起作用。您可能需要考虑使用流量控制库,例如 first (或者您的任何其他偏好,只需搜索“流量控制库”)以使这变得更容易。
此外,您可能需要考虑不依赖分号插入并手动键入分号。它可以防止出现歧义的表达式并使代码更易于阅读。
我是一名优秀的程序员,十分优秀!