Как я могу сделать так, чтобы эта консоль.журнал выполняется после завершения описанной выше функции?

# #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. Большое спасибо! 🙂