在Firebase中使用set()时发生的事件顺序是什么?

时间:2019-05-03 05:16:26

标签: javascript firebase firebase-realtime-database

我下面的代码尝试将Timestamp插入Firebase。我指的是this one here。我计划检索插入的Timestamp并将所说的Timestamp转换为Timestamp JS对象,以便在用户请求该时间时显示。我尝试检索说的Date并遇到了一些对我来说很奇怪的事情。

最初,我具有以下代码:

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(),第一个出现的是读取数据过程。但是,由于Firebase甚至没有设置console.log(...)的值,我不应该读取timeCreated或其他类似null的值吗?相反,读取数据代码返回的null值要比Timestamp的{​​{1}}略小。

编辑

根据请求,这些是我使用初始代码得到的结果:

Result

但是,存储在我的Firebase中的Timestamp的值为:set(),与上图的结果不同(上图的结果是{{1}的结果} [{timeCreated])。

1 个答案:

答案 0 :(得分:1)

执行此代码时:

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()是异步的,所以它之后的代码将在数据检索之前执行。


  

相反,读取数据代码返回的Timestamp值要比要set()的Timestamp小。

由于您在Date()中创建了一个新的console.log(),因此您可能有以下时间。

console.log(new Date(null));