Прежде чем перейти к ответу, имейте в виду, что выполнение вашего требования легче сказать, чем сделать.Реализация этого для существующей инфраструктуры будет большой работой, и если вам абсолютно необходимо это сделать, вероятно, лучше использовать существующие инфраструктуры на стороне сервера.
Подход с HTTP
HTTPэто неправильный протокол для этой задачи.Он основан на запросе / ответе и ожидает, что клиент узнает , когда он хотел бы запросить информацию.
Если вы должны использовать HTTP, я могу придумать только два пути.
Вариант 1: Создайте один HTTP-запрос, который никогда не будет закрыт, т. Е. В экспрессе сервер никогда не отправляет res.end()
или что-то в этом роде.Этот подход также требует специального HTTP-клиента, так как по умолчанию Angular HTTP-клиент ожидает завершения запроса перед отправкой какого-либо уведомления подписчикам.Тем не менее, браузеры могут отключить запрос, если с сервера не отправлено никаких данных, поэтому вы должны реализовать функцию keep-alive самостоятельно.
Вариант 2: Использовать "опрос" - это означает, чтоВы постоянно спрашиваете свой сервер, изменились ли данные.Это может быть реализовано в RxJS с помощью:
interval(1000).pipe
switchMap(() => this.http.get(...)
)
Это связано с огромным недостатком, заключающимся в том, что ваш сервер (а также ваша БД) должны обрабатывать много запросов, и ваш сетевой трафик увеличивается (хотя только небольшие пакетыпослал). Однако , это, вероятно, будет проще для вас реализовать, так как почти ничего не нужно менять для поддержки этого.Имейте в виду, что ваш сервер и база данных в какой-то момент выйдут из строя, если у вас одновременно будет слишком много пользователей.
Альтернативный подход с WebSockets
Браузер поддерживает только очень много протоколов, поэтомутолько ограниченное количество решений для вашего требования.Одним из них является WebSocket .В основном это протокол TCP через браузер, но он позволяет долгоживущим соединениям с возможностью для сервера передавать данных клиенту.Для этого есть даже класс в RxJS, который называется WebSocketSubject
.
Теперь этот подход масштабируется лучше, чем любой HTTP-подход, но, вероятно, требует от вас перестройки огромных частей вашего бэкэнда.Если вы хотите углубиться в это, вы можете начать здесь .
Примечание о базе данных
Мы говорили только о сетевом взаимодействии, но, конечно,Ваша база данных также должна поддерживать наблюдаемый API (за исключением метода опроса).Вам нужно заглянуть в документацию вашей конкретной системы баз данных, чтобы узнать, работает ли она.