# #javascript #firebase #google-cloud-firestore
Вопрос:
Я использую firebase, и у меня возникла проблема. Я пытаюсь разрешить пользователю зарегистрироваться, но чтобы проверить, что учетная запись еще не существует, я хочу получить все имена пользователей из firestore, а затем просмотреть их, чтобы узнать, существует ли уже предлагаемое имя пользователя. Вот мой код для этого:
document.querySelector("#form1").addEventListener("submit", e => {
e.preventDefault();
var users;
firestore.collection("users").get().then(querySnapshot => {
users = querySnapshot.docs.map(doc => doc.data());
console.log(users);
});
console.log(users);
});
Поэтому я знаю, что когда я пытаюсь выполнить console.log(пользователи) во второй раз, описанная выше функция, возможно, не завершила свое выполнение, поэтому, когда я регистрирую ее в консоли, я вижу «неопределенное». Как я могу изменить свой код так, чтобы второй console.log(пользователи) ждал завершения описанной выше функции?
Я попытался разобраться в этом и нашел некоторые вещи, связанные с «асинхронностью» и «ожиданием», но я не мог понять, как заставить их работать в моем коде. Может быть, это может быть решением?
Комментарии:
1. Зачем вам нужен второй
console.log()
? Вы уже напечатали результат в первом.2. оба только для отладки, первая функция console.log() печатает, а вторая-нет
3. Это ожидается именно по той причине, о которой вы сказали в вопросе: он запускается до завершения запроса.
4. да, спасибо, теперь моя проблема решена из приведенного ниже ответа, однако, если вы все еще здесь, у меня есть небольшой вопрос: как вы можете видеть в ответе ниже, теперь есть код
var query = await ref.where("username", "==", theEnteredUsername).get();
, что делать, если я не хотел хранить результат, как я мог сделать что-то вроде:await ref.where("username", "==", theEnteredUsername).get();
5. Если вы не хотите хранить результат, нет причин его ждать.
Ответ №1:
Я не могу предупредить вас достаточно, чтобы не заставить всех users
проверить, есть ли у одного из них одно и то же имя пользователя. Я могу настоятельно рекомендовать запросить одного пользователя с тем же именем пользователя:
document.querySelector("#form1").addEventListener("submit", async (e) => {
e.preventDefault();
const theEnteredUsername = ""; // get it from somewhere
// Create a reference to the cities collection
var ref = firestore.collection("users");
// Create a query against the collection.
var query = await ref.where("username", "==", theEnteredUsername).get();
if (query.empty) {
//you can use the username
} else {
//username taken!!!
}
});
В противном случае ваш счет за Firebase будет чрезвычайно расти по мере увеличения числа пользователей в вашем приложении.
Комментарии:
1. привет, спасибо за совет, вместо этого я буду использовать запрос, но просто чтобы я мог знать, не могли бы вы объяснить, какова цель асинхронности в приведенном выше коде?
2. Для того, чтобы использовать
await
в своем коде блок кодаfunction
или, в котором вы хотите его использовать, необходимо иметьasync
. Таким образом, другой код, который вызывает,functions
знает, что это асинхронная функция.3. Большое спасибо! 🙂