как заставить rxjs приостановить поток, а затем начать снова позже

#angular #firebase #rxjs

#angular #firebase #rxjs

Вопрос:

Я делаю что-то в Angular и Firebase. В приложении у меня есть поток данных RxJS из Firebase, который поступает из коллекции, поэтому он действует как массив с асинхронным каналом в шаблоне. За раз отображается один элемент, а остальные элементы находятся за пределами экрана справа или слева. Пользователь может изменить то, что отображается на экране, просматривая элементы по одному за раз. Существует кнопка, которая изменяет данные отображаемого элемента. Поскольку элементы являются частью потока данных, и данные были обновлены, он удаляет их из потока, этот элемент не соответствует требованиям, которые остаются в этом потоке из-за изменения. Есть ли способ либо приостановить поток, либо каким-либо образом сохранить данные постоянными, даже если данные Firebase изменились до тех пор, пока не будут просмотрены все элементы или не будет выполнено какое-либо другое требование, а затем снова запустить поток или разрешить повторное поступление обновленных данных?

Ответ №1:

Если вы используете асинхронный канал Angular и напрямую подключаете его к потоку данных из коллекции firebase, то влияние обновлений данных будет в режиме реального времени, как вы видели. Именно так и должна работать firebase.

Простой способ отложить обновления — временно сохранить обновления в отдельной переменной в компоненте Angular и пакетные обновления в firebase вместе в конце. Однако, если другой пользователь A обновляет данные с другого устройства, которое влияет на поток, видимый на экране пользователя B, тогда обновление от A будет отображаться в режиме реального времени.

Другим способом было бы реализовать подписку на сбор отдельно и настроить кеш (скажем, с использованием темы RxJS, скажем, в службе) и реализовать пользовательский интерфейс для использования этой темы в качестве ее источника, а не для прямого подключения к firebase. Затем вы можете использовать триггеры, основанные на нажатиях кнопок пользовательского интерфейса, чтобы подписаться, когда обновления необходимы, и отказаться от подписки, когда они не нужны. Таким образом, служба по-прежнему хранит в кэше последние данные, но пользовательский интерфейс не будет обновляться, пока пользователь изменяет данные.