【发布时间】:2015-03-25 16:57:42
【问题描述】:
我正在向我的 mongodb 查询正在通过会话传递的用户电子邮件。当找到该电子邮件时,它会查找该用户的朋友,并且这些朋友应该被传递到usersFriends 数组,然后在块中发送到浏览器。我在这个块中包含了所有代码,即使事务块并不是真正相关的,或者我认为。
问题: 是usersFriends 数组在任何地方都输出一个空数组,除非console.log 在for 循环内。想法?
app.get('/api/chunk', function(req, res){
var last5;
var usersFriends = [];
Transaction.find().sort({$natural:-1}).limit(5).exec(function(err, docs){
if (err) {
console.log(err);
} else {
last5 = docs;
}
});
User.findOne({ email: req.user.email }, function(err, user){
if (!user) {
console.log(err);
} else {
for (var i = 0; i < user.friends.length; i++) {
(function(cntr){
User.findOne({ email: user.friends[cntr].email}, function(err, result) {
result.password = "Sneaky sneaky"
var name = result.firstName + " " + result.lastName;
usersFriends.push({
name: name,
index: cntr
});
});
})(i);
var chunk = {
"friends": usersFriends,
"transactions": last5
};
} }console.log(usersFriends); // empty array
});
});
【问题讨论】:
-
尝试在异步回调中使用
for循环索引。这有数百个重复。我看看能不能找到。 -
看了那篇帖子后,我有点理解这个问题。这里我有两个异步函数,所以
usersFriends数据需要经过两个异步函数。我对闭包知之甚少,所以我很困惑。我更新了代码以使用引用帖子中的 for 循环解决方案。 -
我重新打开了它。这确实解决了
for循环索引的第一个问题。但是,您似乎还有其他问题,因为您需要知道所有内部.findOne()操作何时完成,以便您可以知道何时使用userFriends结果。这部分也有很多重复。 -
非常感谢!这就是问题是的,一旦异步函数完成,我需要将 usersFriends 数据传回外部到
usersFriends数组,以便它可以与块一起发送。 -
而且仅供参考,这不是范围问题。这是一个时间问题。异步操作在未来某个时间完成。在任何异步响应完成之前,您正在执行
console.log(userFriends)。
标签: javascript node.js mongodb for-loop mongoose