我在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'那么'首先'。
答案 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();
});