Отображать повторяющиеся события после обновления данных firestore, но сами данные в firestore не дублируются
У меня есть веб-приложение (Angular) и мобильное приложение (Ionic). Обе они имеют одни и те же данные Firestore.
Используйте веб-приложение для обновления существующих данных, но в ионном приложении отображаются повторяющиеся элементы (дубликаты будут удалены после перезапуска мобильного приложения), я сам проверю данные элемента в Firestore, он был обновлен и уникален. Кто-нибудь знает об этом?
Эта проблема возникает только в мобильном приложении, отличном от веб-приложения, оба из них используют "angularfire2": "^5.0.0-rc.4",
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
this.posts$ = this.db.getRecentPosts().snapshotChanges().pipe(
map(arr => arr.map(doc => {
return { id: doc.payload.doc.id, ...doc.payload.doc.data() }
}
))
);
Были исследования и кажется (не на 100% уверен) проблема angularfire2: AngularFirestoreCollection иногда возвращает дубликат записей после вставки новой записи
Ответы
Ответ 1
Поскольку дубликаты исчезли после перезагрузки, а другие люди сообщают об этой проблеме, я чувствую, что проблема находится в пределах самого AngularFirestore
. В качестве обходного пути вы можете попробовать следующее:
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
this.posts$ = this.db.getRecentPosts().snapshotChanges().pipe(
map(arr => arr.reduce((acc, doc) => { // map -> reduce
const id = doc.payload.doc.id
// remove !(id in acc) to get last duplicate
!(id in acc) && acc[id] = { id, ...doc.payload.doc.data() }
return acc }
}, {} // reduce seed
)),
// you can also Object.values(arr.reduce(...)), but this I find bit more readable
map(coll => Object.values(coll))
);