Rxjs shareReplay失效(超时)

Rxjs shareReplay失效(超时),rxjs,Rxjs,在Rxjs中,想象一个流,它获取一些数据,然后使用shareReplay保存最新的值以进行优化 const value = fetchData().pipe( shareReplay(1) ) 但是,如果该值可能会过期,那么在这种情况下(并且只有在这种情况下)应该重新获取该值 const value = fetchData().pipe( shareReplay(1), switchMap((value) => isExpired(value) ? fetchData() :

在Rxjs中,想象一个流,它获取一些数据,然后使用
shareReplay
保存最新的值以进行优化

const value = fetchData().pipe(
  shareReplay(1)
)
但是,如果该值可能会过期,那么在这种情况下(并且只有在这种情况下)应该重新获取该值

const value = fetchData().pipe(
  shareReplay(1),
  switchMap((value) => isExpired(value) ? fetchData() : of(value))
)
这并不完全正确,因为在第一次重新获取后,值不再共享,并且每次都会重新获取


这种“保持最新值”和“无效”的功能如何用Rxjs表示?

好吧,只需保留一个变量:
const val=fetchData().pipe(shareReplay(1))
然后:

val.pipe(switchMap((值)=>isExpired(值)?val:of(值))

您可以执行以下操作:

const value$ = fetchData().pipe(
  expand(res => timer(res.validForMs).pipe(switchMap(() => fetchData()))),
  shareReplay(1)
);
这样,缓存失效发生在
shareReplay
之前,每个订户也将获得最新的值

我举了一个简单的例子来说明:

//  just mocks
// ---------------------------
const fetchData = () =>
  of({
    token: uuid(),
    validForMs: 2000
  });
// ---------------------------

const value$ = fetchData().pipe(
  expand(res => timer(res.validForMs).pipe(switchMap(() => fetchData()))),
  shareReplay(1)
);

merge(
  value$.pipe(
    tap(res => console.log(`Subscriber 1 received token ${res.token}`))
  ),
  value$.pipe(
    tap(res => console.log(`Subscriber 2 received token ${res.token}`))
  ),
  value$.pipe(
    tap(res => console.log(`Subscriber 3 received token ${res.token}`))
  )
).subscribe();
输出为:

Subscriber 1 received token f7facb6f-2c16-4b0f-abc7-53e5c7461778
Subscriber 2 received token f7facb6f-2c16-4b0f-abc7-53e5c7461778
Subscriber 3 received token f7facb6f-2c16-4b0f-abc7-53e5c7461778

Subscriber 1 received token 67419f6a-65ff-482d-9ede-c38b1405e31e
Subscriber 2 received token 67419f6a-65ff-482d-9ede-c38b1405e31e
Subscriber 3 received token 67419f6a-65ff-482d-9ede-c38b1405e31e

Subscriber 1 received token b978b439-3ae5-440e-9d96-9f320db6e051
Subscriber 2 received token b978b439-3ae5-440e-9d96-9f320db6e051
Subscriber 3 received token b978b439-3ae5-440e-9d96-9f320db6e051

这里的演示

我认为要么你不理解问题,要么我不理解答案。尼斯,我不知道
展开
。这里唯一的假设是你可以事先知道它什么时候到期。理想情况下,应该在有新订阅时检查共享值是否仍然有效,否则将失效并重新获取