【发布时间】:2015-08-12 01:59:13
【问题描述】:
在下面的代码中,我有一个无限循环,我不知道它为什么会发生。我最好的猜测是因为里面的函数是async 循环不会等待它,所以循环永远不会停止。解决此问题的最佳方法是什么?
var generateToken = function(userId) {
return new Promise(function(resolve, reject) {
User.findOne({userId: userId}, function(err, user) {
if (user !== null) {
var loop = true;
while (loop) {
var token = Common.randomGenerator(20);
(function(e) {
User.find({tokens: e}, function(err, result) {
if (err) {
loop = false;
reject('Error querying the database');
} else {
if (result.length === 0) {
if (user.tokens === undefined) {
user.tokens = [];
}
user.tokens.push(e);
loop = false;
resolve();
}
}
});
})(token);
}
} else {
return reject('UserNotFound');
}
});
});
};
这个函数接收一个 userId(User.findOne() 用于查找用户,如果没有具有该 id 的用户,则拒绝该承诺)并为该用户创建一个 唯一 随机令牌(@987654326 @) ,将其添加到保存在 MongoDB 中的用户实体中,并将其返回给调用者。
(注意有一些反对票说这个问题与this one 相同,这不是因为我的代码中已经有一个闭包并且它仍然不起作用。那个问题更多关于如何将循环变量绑定到闭包)
【问题讨论】:
-
如果内部查找结果长度不为 0,什么会将循环设置为 false?
-
有点感觉如果我们确切地知道这样做的目标是什么,所有这些都可以浓缩为一个查询。 mongo 有一个非常强大的属性和子文档过滤系统。
-
@KevinB 实际上这段代码是为了学习(不是一个真正的项目,我现在关心它的性能。即使我可以用其他方式做到这一点,问题仍然是一样的)它包括 2查询不是我不确定是否可以在 Mongo 的一个查询中完成的查询,但看看它是如何工作的可能会很有趣。
-
@doldt :不,我在帖子的最后一行添加了评论。
标签: javascript node.js promise