首页 > 解决方案 > 更新firebase实时数据库时的JavaScript无限循环

问题描述

我试图让未登录的用户能够将项目添加到购物篮中。单击按钮时,将运行以下代码。默认情况下,篮子值不存在,因此 if 语句应该创建一个值。else 语句将对现有值加 1。

这似乎导致了一个无限循环,并且数据库中的数字跳到了 1016。我可能以错误的方式处理了这个问题,不知道如何阻止它。

function addToBasket(sessionID){
  firebase.database().ref('tempUser/' + sessionID).on('value', function (snapshot) {
    var data = snapshot.val();
    
    if (data == null) {
      //update
      firebase.database().ref('tempUser/' + sessionID).set({
        basket: 1,
      });
    }
    
    else {
      //get basket number
      var currentBasket = Object.values(data);
      //turn string into a integer 
      let number = parseFloat(currentBasket) ;
      //add one to the value
      var newNumber = number + 1;
      //upload new number to db
      firebase.database().ref('tempUser/' + sessionID).set({
        basket: newNumber,
      });
    }

  });
}

Firebase 实时数据库

预先感谢您的任何帮助或建议,康纳

标签: javascriptfirebase-realtime-database

解决方案


您在tempUser/$sessionID数据库中附加了一个永久侦听器。这意味着 Firebase 会立即使用数据库中的当前值调用您的回调方法,然后在每次值更改时调用相同的回调。

由于此调用中,您正在使用 更改数据tempUser/$sessionID,这会再次触发相同的回调。然后对 进行另一次更改tempUser/$sessionID,再次触发回调。一次又一次……

如果您只想更改一次值,请使用once()代替on()

 firebase.database().ref('tempUser/' + sessionID).once('value', ...

推荐阅读