Логика подключения между потоками : Rxjs Firebase Firestore

# #firebase #google-cloud-firestore #rxjs

Вопрос:

  this.store
      .collection(collectioName)
      .onSnapshot((data) => {
        
      });
 

Мы можем прослушать документ с помощью метода onSnapshot (). Каждый раз при изменении содержимого другой вызов обновляет снимок документа.

Я ищу оператора hook/rxjs, который мы можем использовать в промежутках, когда данные собираются изменяться/излучаться, и данные, полученные потоком.

Это будет полезно для

  1. показывать счетчик загрузки, когда мы получаем новые данные или
  2. отключите форму или таблицу, когда мы получили новое обновление

Что-то вроде

  this.store
      .collection(collectioName)
      .onSnapshot()
.pipe(
  aboutToInitiate(() => { // start spinner },
  dataReceived(() => { // stop spinner, stream received }

).subscribe(() => {
// Or we can stop spinner here, but where exactly we hook the logic to start spinner 
    

);
 

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

Короче говоря, это промежуточная подписка, которая автоматически запускает счетчик при получении данных и автоматически останавливается при получении данных.

Мы можем использовать оператора tap, но он сработает после получения данных, а не когда он начнет процесс обновления.

Ответ №1:

Он onSnapshot() прослушивает изменения данных в режиме реального времени. Это означает, что у вас может быть счетчик только при инициализации. Каждое изменение после этого происходит немедленно, ваше устройство получает его из бэкэнда или изменяется с вашего устройства. Вы можете запустить прядильщик до того, как инициализируете onSnapshot()

 //START Spinner

 const unsub= this.store
      .collection(collectioName)
      .onSnapshot((data) => {
        //STOP Spinner
      });


//Stop listener
unsub()
 

С unsub помощью этого вы можете перестать слушать изменения в реальном времени.

Одна вещь, которую вам следует учитывать, — это наличие у вас offline включенных возможностей. В этом случае вы можете прослушать оба изменения: данные, записанные в кэш устройства, и данные, записанные в серверную часть. Вы можете сделать это, включив изменения metatadat для вашего слушателя, как здесь:

 db.collection("cities").doc("SF")
    .onSnapshot({
        // Listen for document metadata changes
        includeMetadataChanges: true
    }, (doc) => {
        // ...
    });
 

Затем вы можете определить, записываются ли данные только на устройство или на сервер:

 db.collection("cities").doc("SF")
    .onSnapshot((doc) => {
        var source = doc.metadata.hasPendingWrites ? "Local" : "Server";
        console.log(source, " data: ", doc.data());
    });
 

Вы можете узнать больше об этом здесь.

Вы могли бы использовать это metada , чтобы определить, когда данные записываются локально (затем запустите счетчик) и когда они записываются на сервер (остановите счетчик).