Бесконечный цикл JavaScript при обновлении базы данных firebase в реальном времени

#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,
      });
    }

  });
}
 

База данных Firebase в реальном времени

Заранее благодарю вас за любую помощь или совет,
Коннор

Комментарии:

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', ...