Firebase,异步检索数据

时间:2016-09-03 01:59:05

标签: javascript asynchronous firebase promise firebase-realtime-database

我在javascript中写了一个承诺来延迟动画,直到从我的firebase数据库中检索到一些数据。问题在于,由于某种原因,承诺不起作用,并且代码不是异步运行的。我没有正确使用这个承诺,还是有其他问题?

var name = document.querySelector('.name')

new Promise (function() {
        firebase.database().ref('users/' + userId ).on('value', function(snap) {
            console.log('first');   
            name.innerText = snap.child('name').val();
        });
    }).then(console.log('second'));

我的问题是,当我检查控制台时,我发现代码不是异步运行的,而且我会看到以错误的顺序记录的消息,' second'那么'首先'。

1 个答案:

答案 0 :(得分:3)

第一个问题是(正如我对cartant的回答所评论的那样)tag处理程序可以被多次调用,因此不能被视为一个承诺。

如果您只关心节点的当前值,可以使用on(),它确实会返回一个承诺:

once()

或者,如果您执行也关心值的更改,您可能希望继续使用var name = document.querySelector('.name') firebase.database().ref('users/' + userId ).once('value', function(snap) { console.log('first'); name.innerText = snap.child('name').val(); }).then(function() { console.log('second') }); 。但在这种情况下,你应该传递一个回调。

on()

如果要显式检测此中的第一个值,请执行以下操作:

var name = document.querySelector('.name')

firebase.database().ref('users/' + userId ).on('value', function(snap) {
    console.log('first');   
    name.innerText = snap.child('name').val();
});