Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新firebase实时数据库时的JavaScript无限循环_Javascript_Firebase Realtime Database - Fatal编程技术网

更新firebase实时数据库时的JavaScript无限循环

更新firebase实时数据库时的JavaScript无限循环,javascript,firebase-realtime-database,Javascript,Firebase Realtime Database,我正在尝试允许未登录的用户能够将项目添加到购物篮中。 单击按钮后,将运行下面的代码。 默认情况下,篮子值不存在,因此if语句应该创建一个值。 else语句将向现有值添加1 这似乎会导致无限循环,数据库中的数字会跳到1016。 我可能以错误的方式处理了这个问题,不知道如何阻止它 function addToBasket(sessionID){ firebase.database().ref('tempUser/' + sessionID).on('value', function (snaps

我正在尝试允许未登录的用户能够将项目添加到购物篮中。 单击按钮后,将运行下面的代码。 默认情况下,篮子值不存在,因此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,
      });
    }

  });
}

提前感谢您的帮助或建议,
Connor

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

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

如果只想更改一次值,请使用
one()
而不是
on()


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

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

如果只想更改一次值,请使用
one()
而不是
on()


您希望数据是对象还是数字?Object.values用于返回由对象中的值组成的数组
parseFloat
在对数组使用时返回
NAN
。如果
data
是一个数字,直接引用即可<代码>让newNumber=data+1如果数据是购物车项目的对象,则需要确定其长度。尝试
let number=currentBasket.length()谢谢凯文,为我指明了正确的方向。看到你提到的NAN返回,我希望它是一个数字,但它是一个数组。我现在已经让它与数字一起工作了,但代码似乎仍然在循环?你希望
数据
是一个对象还是一个数字?Object.values用于返回由对象中的值组成的数组
parseFloat
在对数组使用时返回
NAN
。如果
data
是一个数字,直接引用即可<代码>让newNumber=data+1如果数据是购物车项目的对象,则需要确定其长度。尝试
let number=currentBasket.length()谢谢凯文,为我指明了正确的方向。看到你提到的NAN返回,我希望它是一个数字,但它是一个数组。我现在已经让它与数字一起工作,但代码似乎仍然在循环?
 firebase.database().ref('tempUser/' + sessionID).once('value', ...