Обновление в Firestore вызывает бесконечный цикл

В настоящее время я пытаюсь настроить счетчик в Firestore с помощью Angular 4, который обновляется всякий раз, когда человек нажимает определенную кнопку. Нажатие кнопки обновляет счетчик, но запускает бесконечный цикл. Единственный способ остановить это — закомментировать строку, что не помогает, поскольку мне нужно обновлять счетчик каждый раз, когда я решаю нажать эту кнопку. Вот код.

addFoodToCart(uid: string, email: string, item: Goods)
  {
    this.getUserInDB(email).doc(uid).valueChanges().subscribe(a =>
    {
      this.getUserInDB(email).doc(uid).collection('cart').add(item);
      this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email});
    });
  }

Как вы можете видеть, я также добавляю элемент в ту же базу данных, но я также прокомментировал эту часть, и это все еще вызывает бесконечный цикл в базе данных. Любая причина, почему это происходит и как это исправить? Я также использую Google Chrome в качестве веб-браузера для разработки. Не знаю, имеет ли это значение


person Anirudh Upadhyayula    schedule 03.11.2017    source источник


Ответы (1)


Мне сложно это проверить, но вы можете добавить оператор take(), чтобы отключить подписку после одного возвращаемого значения:

addFoodToCart(uid: string, email: string, item: Goods)
{
    this.getUserInDB(email).doc(uid).valueChanges().take(1).subscribe(a =>
    {
        this.getUserInDB(email).doc(uid).collection('cart').add(item);
        this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email});
    });
}

Предполагая, что у вас есть долгосрочная подписка на этот документ, подключенная где-то еще, обновление должно быть отражено автоматически.

Обратите внимание: в зависимости от того, что делает ваше приложение, вам может потребоваться ожидать этих вызовов (или обрабатывать промисы каким-либо другим способом

person Sam Storie    schedule 03.11.2017
comment
Не могли бы вы поставить оператора взятия после подписки. Я пытался это сделать, и он говорит, что take() не существует для подписки типа - person Anirudh Upadhyayula; 03.11.2017
comment
Да, вам нужно будет импортировать оператор в верхней части вашего файла. Ознакомьтесь с документами angular или rxjs, чтобы увидеть синтаксис (извините за мой телефон, я попытаюсь предоставить его вам). - person Sam Storie; 04.11.2017
comment
Я попытался сделать так, как вы предложили, и это все еще касается этой проблемы. Однако я заметил, что он, кажется, выполняется, когда я изменяю значение в firestore, поэтому, возможно, его выполнение основано на изменении значения в базе данных firestore. - person Anirudh Upadhyayula; 04.11.2017