# #javascript #firebase #google-cloud-firestore
Вопрос:
Я пытаюсь использовать прослушиватель моментальных снимков документов для Firebase Firestore. Я хочу выполнить некоторые действия на основе текущего значения документа с сервера, но также прослушивать изменения в документе и по возможности включать автономный кэш.
Прослушиватель работает над обновлением состояния при изменении документа, но по какой-то причине всегда работает с предыдущим кэшем того, что изменилось при прослушивании:
let unsub = firebase.firestore().collection('myCol').doc('myDoc').onSnapshot((doc) => {
if(doc.data().myVal) myFunction(); //myVal is always what the last listener thought it was, not updated from current server value
}
Поэтому, если я затем позвоню unsub()
и внесу изменения в документ в консоли, в следующий раз, когда прослушиватель будет запущен, он вернет последнее значение кэша с момента его предыдущего прослушивания, а не первую загрузку с сервера.
Как я могу заставить слушателя получить первое значение с сервера вместо старого локального кэша?
Комментарии:
1. Не могли бы вы, пожалуйста, попытаться
.onSnapshot({ includeQueryMetadataChanges: true }, (doc) => {})
проверить, является ли источником данных кэш, зарегистрировав «snapshot.metadata.fromCache»?2.
snapshot.metadata.fromCache
зарегистрирован как истинный, добавление изменений метаданных, похоже, не помогло3. Вы включили сохраняемость в автономном режиме?
4. Да, используя
firebase.firestore().enablePersistence().catch((e) => {});
5. В документации говорится: «Если вы включили автономную сохраняемость, ваши слушатели будут получать события прослушивания при изменении локально кэшированных данных».
Ответ №1:
Единственный способ, которым я в настоящее время могу заставить логику прослушивателя сначала загружаться с сервера, — это сначала вручную запустить get() в документе. Это просто обновляет локальный кэш любых изменений, которые произошли, когда прослушиватель не слушал в последний раз.
Если у вас возникли аналогичные проблемы с вашим кодом, добавьте это перед настройкой логики прослушивателя:
await firebase.firestore().collection('myCol').doc('myDoc').get({source: 'server'}).catch(e => {});