Как избежать избыточной загрузки данных при использовании 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 уже делает.

0 ответов

Другие вопросы по тегам