我正在编写一个为每个新用户生成唯一用户名的函数。首先,分配一个与用户全名匹配的用户名,然后检查数据库中是否存在该用户名。如果存在,则向其添加一些数字,然后再次检查,直到找到数据库中不存在的新用户名为止。
下面是相同的代码
var generateUsername = function(name){
var username = name;
console.log(username);
var isUsername;
var number = 0;
db.collection("users").where("username", "==", username)
.get()
.then(function(querySnapshot) {
if(querySnapshot.empty){
isUsername = false;
}
else {
isUsername = true;
}
while(isUsername == true){
number++;
username = fullName + number;
console.log(username);
db.collection("users").where("username", "==", username)
.get()
.then(function(querySnapshot) {
if(querySnapshot.empty){
isUsername = false;
}
else {
isUsername = true;
}
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
这没有给我想要的输出。循环无限运行。我在哪里做错了?
因此,在提出andy mccullough
建议之后,我想出了以下解决方案
var generateUsername = function(name){
var username = name;
var isUsername;
var number = 0;
db.collection("users").where("username", "==", username).get()
.then(function(querySnapshot) {
if(querySnapshot.empty){
isUsername = false;
}
else {
isUsername = true;
}
(async function loop(){
while(isUsername == true){
number++;
username = name + number;
var querySnapshot = await db.collection("users").where("username", "==", username).get();
if(querySnapshot.empty){
isUsername = false;
}
else {
isUsername = true;
}
}
console.log(username);
})();
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
必须等待循环功能,直到数据库返回一个承诺。使用异步等待可以实现。您可以参考此答案以获取更多详细信息JavaScript ES6 promise for loop