在javascript中的实时firebase数据库上创建新ID
我正在尝试在实时firebase数据库上创建一个长度为5的新唯一ID,它只包含大写字母和数字。我解决这个问题的想法是创建一个ID,检查数据库中是否已经存在这个ID,如果已经存在,则创建一个新ID并重复,直到找到唯一的ID为止。我不确定如何利用数据库调用的异步性质来解决这个问题。我尝试过使用承诺来解决这个问题,但我不确定如何使用递归承诺来解决这个问题 就我所知:在javascript中的实时firebase数据库上创建新ID,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在尝试在实时firebase数据库上创建一个长度为5的新唯一ID,它只包含大写字母和数字。我解决这个问题的想法是创建一个ID,检查数据库中是否已经存在这个ID,如果已经存在,则创建一个新ID并重复,直到找到唯一的ID为止。我不确定如何利用数据库调用的异步性质来解决这个问题。我尝试过使用承诺来解决这个问题,但我不确定如何使用递归承诺来解决这个问题 就我所知: const database = firebase.database(); function createRoom() { /
const database = firebase.database();
function createRoom() {
//Create random ID of length 5 consisting of only uppercase letters and numbers
const ID = createID(5);
return new Promise((success) => {
//Check if ID already exists in database
exists(ID).then(() => {
return createRoom()
}).catch(() => {
success(ID)
});
});
}
function exists(ID) {
return new Promise((resolve, reject) => {
database.ref('rooms').child(ID).once('value', snapshot => {
if (snapshot.exists()) {
resolve()
} else {
reject()
}
})
})
}
您可以尝试以下方法:
let ID = database.collection('someCollection').doc().id;
这将创建一个唯一的ID问题是,ID需要是一个长度为5的字符串,仅由大写字母和数字组成。您在问题上没有这样说。你应该加上这个限制。编辑:对不起,我现在在代码注释上看到了。也许你们可以把它放在tooOP使用实时数据库的代码之外,而你们的代码是用于CloudFireStore的。虽然这两个数据库都是Firebase的一部分,但它们是完全独立的,并且具有不同的API。您可以将ID字符串切割为5个字符,并使用函数“toUpperCase()”,非常确定这将允许冲突。例如,“FOOBA123”和“FOOBA789”是唯一的,但是通过将字符串切割为5个字符,它们就等同于相同的字符串。当您已经有承诺要处理时,使用
新承诺通常是一种不好的做法。直接使用这个承诺——不要用新的承诺来包装它。