169 похожих чатов

Есть такой широкоизвестный кейс: 1. Получить объект *currentUser* с *API* 2. Расшарить

всем компонентам этот объект не делая лишних запросов к *API*

Логично шарить этот объект с помощью *BehaviorSubject* просто подписываясь на него в нужных компонетах

Но есть момент что в каком-то одном компоненте обязательно нужно вызвать метод который сделает запрос на БЕ иначе * BehaviorSubject* отдаст дефолтное значение.

*Вопрос*:
Как правильно описать логику в сервисе чтобы во всех компонентах для того чтобы получить currentUser нужно было только подписаться на *BehaviorSubject* и не нужно было вызывать метод который делает запрос к *API* ??
Простыми словами чтобы при подписке была проверка что у нас *currentUser* пустой или *null* (дефолтное значение) то делается запрос к API, а если есть то просто его отдать.

1. Я пробовал прямо в Сервисе который отвечает за Юзера в его конструкторе вызывать метод *this.getUser().subscribe()*, но не уверен что это правильно и не принесет багов

2. Так же была идея отлавливать ивент на подписке (кастомный onSubscribe) проверять что подписчик первый (чтобы не делать запрос на каждой подписке) и только тогда делать запрос к *API*

2 ответов

11 просмотров

class CurrentUserService { private currentUser: Observable<User>; constructor(service: ...) { const storedUser = new BehaviorSubject<null | User>(null); this.currentUser = storedUser.pipe( switchMap(stored => stored ? of(stored) : service.get(...).pipe( switchMap(remote => { storedUser.next(remote); return NEVER; }) ) ), publishReplay(1), refCount(), ); } getCurrentUser(): Observable<User> { return this.currentUser; } }

Для даёшь кэш юзера в сервисе и лишних запросов в АПИ не будет.

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта