Firebase RTDB`ref.once()`被执行多次

时间:2016-07-02 21:39:31

标签: javascript firebase firebase-realtime-database

最近使用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库的错误吗?已知问题?我有什么不正确的事情或我的误解吗?

1 个答案:

答案 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()如何运作的误解。

谢谢,