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