Рекурсивная функция, подобная этой, кажется подходящей:
function getRandomProfileID() {
return new Promise(function(resolve, reject) {
var profileID = ....
var query = usersRef.ref.where("profileID", '==', profileID);
query.get().then((querySnapshot) => {
if (!querySnapshot.empty) {
this.getRandomProfileID();
}
else {
resolve(profileID);
}
})
})
}
И затем вы вызываете ее с помощью:
getRandomProfileID().then(function(profileID) {
console.log(profileID);
});
Или если вы используете более современнуюверсия JavaScript:
var profileID = await getRandomProfileID();
console.log(profileID);
Как указал Дуг, с async
/ await
вы можете даже полностью обойтись без рекурсивной функции:
while (true) {
let profileID = ....
let snapshot = await usersRef.ref.where("profileID", '==', profileID).get()
if (!snapshot.empty) {
break;
}
}
console.log("Found unique ID: " + profileID);
Но есть некоторые вещиеще нужно рассмотреть с этим подходом:
Другой пользователь может генерировать тот же идентификатор профиля между временем, когда вы генерируете и проверяете его, и фактически создаете его.Если это вызывает озабоченность, вам, вероятно, следует использовать транзакцию для вышеуказанной функции и создать документ профиля.Если это не является реальной проблемой, вы все равно должны убедиться в правилах безопасности, что ни один пользователь не может перезаписать документ, который уже был создан другим пользователем.
Если вы собираетесь использовать свойСобственный идентификатор профиля во многих местах для идентификации пользователя, рассмотрите возможность создания дополнительной коллекции, где каждое имя / идентификатор документа является идентификатором профиля, а содержимое документа является ключом к коллекции пользователей.Если вы собираетесь однозначно идентифицировать пользователей по их идентификатору профиля, рассмотрите возможность использования идентификатора профиля в качестве ключа их документа в коллекции пользователей вместо любого используемого вами ключа.