gpt4 book ai didi

angular - RxJS 缓存并使用 shareReplay 刷新

转载 作者:行者123 更新时间:2023-12-03 17:11:26 28 4
gpt4 key购买 nike

我正在为从 API 检索的某些数据使用缓存,出于逻辑原因,存储的数据仅在有限的时间内有效,因此我正在使用以下内容:

someApiData$ = this.getData()
.pipe(shareReplay(1, 3000))
对我来说似乎很明显但对 shareReplay 的创建者显然不是的。操作符是,如果数据不再被缓存,它应该被重新获取,或者至少我应该有另一个参数来给我这个选项,比如:
someApiData$ = this.getData()
.pipe(shareReplay(1, 3000, shouldRefresh))
相反,下一个订阅者将获得空值。
所以,我正在寻找一个优雅的解决方案来解决这个问题。

最佳答案

在对这个线程的答案和网络上的其他一些方法进行了一些跟踪之后,这就是我的结果。它提供了以下能力:

  • 缓存值
  • 如果数据不再缓存,则自动刷新值
  • 直接与 Observable 合作
  • 如果需要,指定缓存生命周期的持续时间
  • 整理我的服务并提供可重用的解决方案

  • 我的缓存工具:
    export class SharedReplayRefresh {

    private sharedReplay$: Observable<T>;
    private subscriptionTime: number;


    sharedReplayTimerRefresh(
    source: Observable<T>, bufferSize: number = 1,
    windowTime: number = 3000000, scheduler?: SchedulerLike): Observable<T> {

    const currentTime = new Date().getTime();
    if (!this.sharedReplay$ ||
    currentTime - this.subscriptionTime > windowTime) {
    this.sharedReplay$ = source.pipe(shareReplay(
    bufferSize, windowTime, scheduler));
    this.subscriptionTime = currentTime;
    }

    return this.sharedReplay$;
    }
    }
    我的数据服务:
    export class DataService {

    constructor(private httpClient: HttpClient) { }

    private dataSource =
    new SharedReplayRefresh<Data>();
    private source = this.httpClient.get<Data>(url);

    get data$(): Observable<Data> {
    return this.dataSource .sharedReplayTimerRefresh(this.source, 1, 1500);
    }
    }

    关于angular - RxJS 缓存并使用 shareReplay 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62633276/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com