我正在尝试生成令牌集合中不存在的随机令牌。所以,我正在使用这张支票:
var foundToken = false;
var token;
while (!foundToken){
token = randomstring.generate(15);
Tokens.findOne({key: token}, function(err,res){
if (err){
console.log(err);
}
if (!res){
foundToken = true;
}
});
}
但是,在运行它时,即使Tokens集合为空,也会在无限循环中生成randomstrings。
为了使事情恶化,如果我删除了第二个条件,即
var foundToken = false;
var token;
while (!foundToken){
token = randomstring.generate(15);
Tokens.findOne({key: token}, function(err,res){
if (err){
console.log(err);
}
foundToken = true;
});
}
它仍会导致无限循环,因此回调甚至不执行。顺便说一下,我已经检查了randomstrings,它们完全不同。
答案 0 :(得分:2)
findOne
是一个异步操作。异步操作和循环不能很好地配合在一起。将查询放在带有回调参数的单独方法中,不要使用while循环。
var token;
getToken(function(generatedToken) {
token = generatedToken;
// proceed with your code
});
function getToken(callback) {
var token = randomstring.generate(15);
Tokens.findOne({key: token}, function(err,res){
if (res === null) {
// success, the token does not exist
callback(token);
} else {
// token exists, try again
getToken(callback);
}
});
}
另请查看Promises,以避免以callback hell结尾。