Запись в Firebase Cloud Firestore - PullRequest
0 голосов
/ 05 апреля 2020

Асинхронная ли запись в firebase cloud firestore в javascript? И если это так, как с этим справиться?

Моя программа должна обновить значение в базе данных, а затем вытащить это значение, чтобы что-то с ним сделать.

В большинстве случаев выводится правильное значение, однако иногда выводится предыдущее значение, но когда страница обновляется и то же значение снова считывается из базы данных, выводится правильное значение.

Итак, я предполагаю, что проблема должна заключаться в том, что запись в базу данных асинхронна, точно так же, как чтение базы данных.

". Then", похоже, не работает.

Вот упрощенная версия моего кода:

function updateDB{
 db.collection("rooms").doc("roomsDoc").update({
   roomTime: timeInput  //timeInput is a variable defined (not shown in code here)              
  }).then
  {
   readDB();
  }
}

function readDB(){
   db.collection("rooms").doc("roomsDoc").get().then(function(doc) {
     console.log(doc.data().roomTime);
   });
}

console.log - это то, что иногда выводит неправильное значение.

Ответы [ 4 ]

1 голос
/ 05 апреля 2020

да, это асинхронно.

хороший способ справиться с возникшей проблемой - async/await.

сначала вам нужно сделать функцию, которую вы делаете это в async функции

, затем сделать что-то вроде этого

async function FunctionName(){
    // do some initial stuff
    await write to the database
    // do some intermediate stuff
    await read from the database
}
0 голосов
/ 05 апреля 2020

Я думаю, что вы сделали здесь опечатку:

.then
  {
   readDB();
  }

, таким образом, вы не ожидаете завершения первой операции. Чтобы получить то, что вы хотите, вам нужно написать:

.then(() => readDB())

0 голосов
/ 05 апреля 2020

Да, это асинхронно.

Вы должны проверить официальную документацию по этой теме c, она была очень полезна для меня при попытке извлечь данные из базы данных / API:

Firebase Cloud Firestore

Сначала вы должны инициализировать ссылку на документ и получить данные с помощью функции get() asyn c и ждать ответа, используя либо then(), либо async/await Метод.

Надеюсь, это поможет!

0 голосов
/ 05 апреля 2020

Все JavaScript API-интерфейсы клиента / браузера, которые работают с файлами и сетями, являются асинхронными - такова природа JavaScript.

then() фактически работает над обещаниями, возвращаемыми Firestore. API (и все обещания, в этом отношении). Есть множество примеров этого в документации .

Не видя ваш код, мы не знаем, что вы делаете неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...