# #firebase #google-cloud-firestore #rxjs
Вопрос:
this.store
.collection(collectioName)
.onSnapshot((data) => {
});
Мы можем прослушать документ с помощью метода onSnapshot (). Каждый раз при изменении содержимого другой вызов обновляет снимок документа.
Я ищу оператора hook/rxjs, который мы можем использовать в промежутках, когда данные собираются изменяться/излучаться, и данные, полученные потоком.
Это будет полезно для
- показывать счетчик загрузки, когда мы получаем новые данные или
- отключите форму или таблицу, когда мы получили новое обновление
Что-то вроде
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
, чтобы определить, когда данные записываются локально (затем запустите счетчик) и когда они записываются на сервер (остановите счетчик).