Как избежать избыточной загрузки данных при использовании switchMap и внутренних наблюдаемых в RxFire?
У меня есть некоторый код RxFire, который слушает запрос коллекции Firestore (представляющий каналы) и, для каждого из результатов, слушает ссылку на базу данных в реальном времени для документов (представляющих сообщения в этом канале).
Проблема, с которой я сталкиваюсь, состоит в том, что документы базы данных реального времени перезагружаются каждый раз, когда изменяется запрос Firestore, даже если они для пути / ссылки, которая не изменилась.
Вот некоторый псевдокод:
collection(channelsQuery).pipe(
// Emits full array of channels whenever the query changes
switchMap(channels => {
return combineLatest(
channels.map(channel =>
// Emits the full set of messages for a given channel
list(getMessagesRef(channel)),
),
);
})
)
Представьте себе следующий сценарий:
- Запрос изначально генерирует 3 документа канала Firestore
- Наблюдаемые создаются для соответствующих ссылок базы данных в реальном времени для тех 3 каналов, которые испускают свои документы сообщения
- Добавлен новый документ Firestore, соответствующий исходному запросу, который теперь генерирует 4- канальные документы.
- Предыдущие наблюдаемые для базы данных реального времени уничтожаются, и создаются новые для теперь уже 4 каналов, перезагружая и испуская все данные, которые у него уже были за предыдущие 3.
Очевидно, что это не идеально, так как вызывает много избыточных чтений в базе данных реального времени. Какова лучшая практика в этом случае? Имейте в виду, что при удалении канала я хотел бы уничтожить соответствующую наблюдаемую, которая switchMap
уже делает.