最近使用firebase RTDB,我一直在使用.once('value', v => ...)
来构建我的应用程序的GUI。确切的代码如下:
<script>
function onAuthCompleted(usr) {
var salesTxRef = firebaseApp.database().ref('/salesTx').limitToLast(5);
salesTxRef.once("value", salesTx => {
salesTx.forEach(txRef => {
const tx = txRef.val();
const $item = $('<li></li>').html('<a href="' + txRef.key + '">$' + tx.total + ' <small>' + tx.currencyCode + '</small></a>');
$('.main ul').append($item);
});
});
}
</script>
问题在于,如果我将页面打开足够长时间,.once()
会被多次调用(每2-3小时一次)。这是javascript库的错误吗?已知问题?我有什么不正确的事情或我的误解吗?
答案 0 :(得分:0)
正如@Frank van Puffelen在评论中指出的那样,问题来自调用onAuthCompleted(usr)
的方法:
firebaseApp.auth().onAuthStateChanged(function(user) {
if (user) {
if (typeof onAuthCompleted == 'function') {
onAuthCompleted(user);
}
} else {
console.log('User is not logged in. Cannot start session.');
}
}, function(error) {
console.log(error);
});
每小时调用onAuthStateChanged()
来刷新会话导致onAuthCompleted()
再次被调用,从而再次注册.once()
方法(每隔〜小时)。这导致了奇怪的感知行为。
我可以确认.once()
按预期工作,这是我对onAuthStateChange()
如何运作的误解。
谢谢,