Какова последовательность событий, которые происходят, когда я использую set () в Firebase? - PullRequest
3 голосов
/ 03 мая 2019

Мой код ниже пытается вставить Timestamp в Firebase. Timestamp Я имею в виду здесь . Я планирую извлечь вставленный Timestamp и преобразовать указанный Timestamp в Date объект JS, который будет отображаться, когда пользователь запрашивает указанное время. Я попытался найти сказанное Timestamp и столкнулся с чем-то довольно странным для меня.

У меня изначально есть следующий код:

let newRef = firebase.database().ref().child('fs').push(); //'fs' here is one of the nodes in my Firebase

newRef.set({
  //Set some other data
  timeCreated: firebase.database.ServerValue.TIMESTAMP
}).then(() => {
  console.log('Insert successful');
});

newRef.once('value').then((snapshot) => {
  console.log(snapshot.val().timeCreated);
  console.log(new Date(snapshot.val().timeCreated));
});

Вскоре я заметил, что разрываю свою цепь Promise. Из-за этого я изменил это на следующее:

let newRef = firebase.database().ref().child('fs').push();

newRef.set({
  //Some other data
  timeCreated: firebase.database.ServerValue.TIMESTAMP;
}).then(() => {
  console.log('Insert successful');
  return newRef.once('value').then((snapshot) => snapshot.val().timeCreated);
}).then((timeRetrieved) => {
  console.log(timeRetrieved);
  console.log(new Date(timeRetrieved);
});

И он восстановил правильные данные.

Моя путаница в исходном коде. Почему Firebase все еще каким-то образом успешно извлекает timeCreated, когда процесс set() еще не завершен? Я посмотрел на console.log(...), и первое, что появилось, - это процесс чтения данных. Однако, поскольку Firebase даже не установил значение timeCreated, я не должен читать null или какое-либо другое null -подобное значение? Вместо этого код чтения данных вернул Timestamp, значение которого немного меньше значения Timestamp, которое должно быть set().

EDIT

В соответствии с запросом, это результаты, которые я получаю, используя мой исходный код:

Result

Однако значение timeCreated, хранящееся в моей Firebase, равно: 1556862732784, что отличается от результата на изображении выше (результат на изображении выше - результат console.log(snapshot.val().timeCreated) [1556862732273] ).

1 Ответ

1 голос
/ 03 мая 2019

Когда вы выполните этот код:

let newRef = firebase.database().ref().child('fs').push(); //'fs' here is one of the nodes in my Firebase

newRef.set({
 //Set some other data
timeCreated: firebase.database.ServerValue.TIMESTAMP
}).then(() => {
console.log('Insert successful');
});

newRef.once('value').then((snapshot) => {
 console.log(new Date(snapshot.val().timeCreated));
});

Вы получите выполнение журналов в следующем порядке:

console.log(new Date(snapshot.val().timeCreated));

console.log('Insert successful');

, и это потому, что set() является асинхронным, поэтому код после того, как он будет выполнен, прежде чем данные будут даже получены.


Вместо этого чтениеКод данных вернул метку времени, которая немного меньше значения метки времени, которая должна быть set().

Поскольку вы создали новый Date() в console.log(), то, вероятно, вы получилив следующий раз.

console.log(new Date(null));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...