Как правильно закешировать каждый отдельный элемент через observable & shareReplay?

Ситуация следующая: получаю список всех элементов Observable и успешно кеширую его через shareReplay.
Но у меня также есть ещё один метод getById(string id), который должен возвращать один отдельный элемент из всех элементов. Т.е. для этого у нас уже есть закешированный observable из всех элементов. Как произвести грамотное отображение одного элемента из кеша, не выполняя обращение к серверу?
  • Вопрос задан
  • 31 просмотр
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
1. Создаете функцию получения данных,
myRequest = () => request.pipe(shareReplay(1));
2. создаете переменную чето типа
list = myRequest();

Это у вас список элементов, при подписке на него выполняется запрос и кешируется. При следующей подписке отдается кэш.

3.
getById = (id) => list.pipe(map(_list => _list.find(filterById(id)))


функция, которая вернет обсервабл с зашитой в него функцией поиска.
например
elementId1 = getById(1);

При подписке на elementId1 будет см. п. 2, а потом поиск в списке.
При вызове getById(2) будет использован тот же самый кэш.

Если проигнорить пункт 2 с записью результата вызова myRequestв переменную и внутри getByIdвызвать функцию myRequestто будет создан второй "кэш" и соответственно второй запрос.
____
так же getByIdтоже можно закэшировать своим shareReplayчтобы не искать второй раз, если у нас где-то будет две подписки на этот элемент.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы