Концепция слушателя Firebase в реальном времени — как отсоединить / отписаться от слушателя?

#javascript #firebase #google-cloud-firestore

#javascript #firebase #google-облако-firestore

Вопрос:

Получение обновлений в реальном времени с помощью облачного Firestore показывает, как подписаться на изменения документа или прослушать их.

 db.collection("cities").doc("SF")
    .onSnapshot(function(doc) {
        console.log("Current data: ", doc.data());
    });
  

Приведенный выше пример имеет смысл. Мой вопрос касается отсоединения слушателя. Правильно ли сказать, что когда мы хотим отсоединить / отписаться / не подписываться на документ, мы просто подписываемся второй раз на ту же ссылку на базу данных?

… вот как это выглядит, но я не совсем понимаю, как / почему?

 var unsubscribe = db.collection("cities")
    .onSnapshot(function (){
      // Respond to data
      // ...
    });

// Later ...

// Stop listening to changes
unsubscribe();
  

Это кажется излишне запутанным. …Почему бы просто не использовать 2 метода, .onSnapshot и .offSnapshot ? Я предположил, что единственное различие, которое я вижу между двумя приведенными примерами, заключается в том, что последний присваивается переменной и что метод вызывается для всей коллекции, а не для одного документа.

Итак, суть: чтобы отказаться от подписки, присоедините .onSnapshot метод к родительской коллекции и присвоите его переменной?

Ответ №1:

Мой вопрос касается отсоединения слушателя. Правильно ли сказать, что когда мы хотим отсоединить / отписаться / отменить доступ к документу, мы просто подписываемся второй раз на ту же ссылку на базу данных?

Вам не нужно подписываться дважды.

Сделанная вами первоначальная подписка возвращает функцию, которая при вызове отменяет подписку. Вы не добавляете этот код во второй раз, вместо этого сохраняете возвращаемое значение из первоначального вызова коллекции в переменную и вызываете его, когда собираетесь отказаться от подписки.

Представьте что-то вроде этого:

 function subscribe() {
  ... do things that subscribe me
  return function() {
    ... do things that unsubscribe me
  }
}

let unsubscribe = subscribe()

// later when I want to unsubscribe
unsubscribe()
  

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

1. я думаю, вы правы. … Этот метод Firebase / Firestore излишне запутан / неинтуитивен для меня, т. Е. Кажется, что .on и .off было бы намного понятнее.

2. Если вы использовали интервалы раньше, это что-то подобное. В интервалах вы получаете идентификатор интервала в качестве возвращаемого значения, и для того, чтобы очистить интервал, вам нужно использовать этот идентификатор, который был возвращен. У вас может быть много интервалов на одной странице, так же как у вас может быть много подписок на firebase. Каждая функция отмены подписки уникальна и, следовательно, включения и выключения недостаточно для описания конкретного объекта, от которого вы хотите отказаться без дорогостоящих вычислений.

Ответ №2:

Да, согласно документации, вам просто нужно вызвать эту unsubscribe функцию, чтобы отказаться от подписки. Переменная, которую возвращает ваш слушатель, на самом деле является регистрацией слушателя (подробнее см. Ниже), поэтому вызов ее для отмены регистрации имеет смысл.

Это действительно довольно запутанно, но поскольку у меня аналогичная настройка на Android, и способ отписки в Android — это вызов remove() в ListenerRegistration экземпляре (та же переменная unsubscribe в Web), я бы сказал, что это всего лишь проблема дизайна для Интернета.