【发布时间】:2020-06-02 20:43:28
【问题描述】:
我正在努力实现这里描述的内容:https://www.prestonlamb.com/blog/rxjs-cache-and-refresh-in-angular
换句话说,我想在给定的时间内(比如说 1 分钟)缓存一个 observable。在给定时间之后进行订阅时,应再次检索数据并再次缓存 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 解决方案来做我想做的事的人?
【问题讨论】:
-
你说你不想每分钟刷新一次数据而是每分钟过期缓存..这是什么意思。你能说得清楚一点吗?
-
最后一个例子正好说明了我的意思。如果 1 分钟后没有请求,则缓存被清除但不会自动检索数据(即:01:00 没有请求)。我们的想法是让第一个场景起作用,而不是最后一个。
标签: caching rxjs rxjs-pipeable-operators