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