#javascript #firebase-realtime-database
#javascript #firebase-realtime-database
Вопрос:
Я пытаюсь разрешить пользователям, не входящим в систему, возможность добавлять товары в корзину. При нажатии кнопки запускается приведенный ниже код. По умолчанию значение корзины не существует, поэтому оператор 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,
});
}
});
}
Заранее благодарю вас за любую помощь или совет,
Коннор
Комментарии:
1. Вы ожидаете
data
, что это будет объект или число? Object.values используется для возврата массива, состоящего из значений внутри объекта.parseFloat
возвращаетNAN
при использовании с массивом. еслиdata
это число, просто ссылайтесь на него напрямую.let newNumber = data 1;
если данные являются объектом элементов корзины, вам необходимо определить его длину. Попробуйтеlet number = currentBasket.length();
2. Спасибо, Кевин, указал мне правильное направление. Увидев упомянутый вами возврат NAN, я ожидал, что это будет число, но это был массив. Теперь я получил его, работая с числами, но код, похоже, все еще продолжает цикл?
Ответ №1:
Вы подключаете постоянного слушателя к tempUser/$sessionID
своей базе данных. Это означает, что Firebase немедленно вызывает ваш метод обратного вызова с текущим значением в базе данных, а затем вызывает один и тот же обратный вызов при каждом изменении значения.
Поскольку внутри этого вызова вы изменяете данные tempUser/$sessionID
, это снова запускает тот же обратный вызов. Который затем вносит другое изменение tempUser/$sessionID
, которое снова запускает обратный вызов. И снова, и снова…
Если вы хотите изменить значение только один раз, используйте once()
вместо on()
:
firebase.database().ref('tempUser/' sessionID).once('value', ...