Я пытаюсь добиться того, что описано здесь: https://www.prestonlamb.com/blog/rxjs-cache-and-refresh-in-angular
Другими словами, я хочу кэшировать наблюдаемое в течение заданного времени (скажем, 1 минуту). Когда подписка осуществляется после указанного времени, данные должны снова извлекаться и снова кэшироваться на 1 минуту.
Пример ожидаемого результата:
T 00:00: Request (1) => RETRIEVE data
T 00:10: Request (2) => data from cache
T 00:35: Request (3) => data from cache
T 00:50: Request (4) => data from cache
T 01:10: Request (5) => RETRIEVE data
T 01:15: Request (6) => data from cache
T 01:30: Request (7) => data from cache
T 02:30: Request (8) => RETRIEVE data
Оператор shareReplay отлично работает для кэширования данных за заданное время, но я не могу повторно запустить его, когда это заданное время истекло.
Пример использования оператора shareRelay(1, 1000):
T 00:00: Request (1) => RETRIEVE data
T 00:10: Request (2) => data from cache
T 00:35: Request (3) => data from cache
T 00:50: Request (4) => data from cache
T 01:10: Request (5) => no response
T 01:15: Request (6) => no response
T 01:30: Request (7) => no response
T 02:30: Request (8) => no response
Ссылка выше пытается изменить это поведение, используя первый оператор, перехватывающий нулевые результаты. К сожалению, это не работает нормально, так как данные не кэшируются после первого раза.
Вот что я получил, используя статью по приведенной выше ссылке (следующее изображение описывает используемый код)
Результат у меня есть:
T 00:00: Request (1) => RETRIEVE data
T 00:10: Request (2) => data from cache
T 00:35: Request (3) => data from cache
T 00:50: Request (4) => data from cache
T 01:10: Request (5) => RETRIEVE data
T 01:15: Request (6) => RETRIEVE data
T 01:30: Request (7) => RETRIEVE data
T 02:30: Request (8) => RETRIEVE data
Я также видел пример с оператором таймера, но в этом случае данные извлекаются каждую минуту, даже если на них нет подписки. Я не хочу обновлять данные каждую минуту, я хочу, чтобы срок действия кэша истекал каждую минуту. К сожалению, я потерял код с оператором таймера, но результат был примерно таким:
Результат с оператором таймера:
T 00:00: Request (1) => RETRIEVE data
T 00:10: Request (2) => data from cache
T 00:35: Request (3) => data from cache
T 00:50: Request (4) => data from cache
T 01:00: NO REQUEST => RETRIEVE data
T 01:10: Request (5) => data from cache
T 01:15: Request (6) => data from cache
T 01:30: Request (7) => data from cache
T 02:00: NO REQUEST => RETRIEVE data
T 02:30: Request (8) => data from cache
У кого-нибудь есть «чистое» решение RxJS, чтобы делать то, что я хочу?