javascript - 更新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,
});
}
});
}
预先感谢您的任何帮助或建议,康纳
解决方案
您在tempUser/$sessionID
数据库中附加了一个永久侦听器。这意味着 Firebase 会立即使用数据库中的当前值调用您的回调方法,然后在每次值更改时调用相同的回调。
由于在此调用中,您正在使用 更改数据tempUser/$sessionID
,这会再次触发相同的回调。然后对 进行另一次更改tempUser/$sessionID
,再次触发回调。一次又一次……
如果您只想更改一次值,请使用once()
代替on()
:
firebase.database().ref('tempUser/' + sessionID).once('value', ...
推荐阅读
- select - MemSql > SELECT ... FOR UPDATE 的解决方法
- http - 在 .Net 中使用带有 HttpClient 的 HTTP 2
- javascript - 无法在下拉 javascript-protractor-jasmine 中选择选项
- css - bootstrap 4 响应式全屏覆盖菜单
- c# - c# ReadAsJsonAsync in framework 4.5
- angular - Internet Explorer 11 中 MatAccordion 组件的缓慢转换
- php - cURL POST 未提交表单
- python - 如何安装 Python 3.5.5?
- c - 如何使用`strtoul`解析零可能有效的字符串?
- wpf - 用于笔划的 WPF InkCanvas Z-Index