更新firebase实时数据库时的JavaScript无限循环
我正在尝试允许未登录的用户能够将项目添加到购物篮中。 单击按钮后,将运行下面的代码。 默认情况下,篮子值不存在,因此if语句应该创建一个值。 else语句将向现有值添加1 这似乎会导致无限循环,数据库中的数字会跳到1016。 我可能以错误的方式处理了这个问题,不知道如何阻止它更新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
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', ...