Прослушиватель документов Firestore не возвращает текущее значение с сервера

# #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 => {});