share()vs ReplaySubject:哪一个,都不起作用

时间:2017-04-06 17:53:25

标签: angularjs caching typescript rxjs

我正在尝试在我的Angular服务中实现短期缓存 - 快速连续创建一堆子组件,每个子组件都有一个HTTP调用。我想在页面加载时缓存它们,但不是永远。

我尝试了以下两种方法,但两种方法都没有效果。在这两种情况下,对于创建的组件的每个实例,都会针对HTTP URL命中一次;我想避免这种情况 - 理想情况下,在创建网格时会触发一次URL,然后缓存过期,下次我需要创建组件时,它会再次点击URL。我从StackOverflow上的其他线程中提取了这两种技术。

分享()(在服务中)

getData(id: number): Observable<MyClass[]> {
    return this._http.get(this.URL)
        .map((response: Response) => <MyClass[]>response.json())
        .share();
}

ReplaySubject(使用中)

private replaySubject = new ReplaySubject(1, 10000);
getData(id: number): Observable<MyClass[]> {
    if (this.replaySubject.observers.length) {
        return this.replaySubject;
    } else {
        return this._http.get(this.URL)
            .map((response: Response) => {
                let data = <MyClass[]>response.json();
                this.replaySubject.next(data);
                return data;
            });
    }
}

来电者(在组件中)

ngOnInit() {
    this.myService.getData(this.id)
        .subscribe((resultData: MyClass[]) => {
            this.data = resultData;
        },
        (error: any) => {
            alert(error);
        });
}

每次创建组件时都没有必要点击URL - 它们返回相同的数据,并且在包含组件的行网格中,数据将是相同的。创建网格本身时,可以调用一次,并将该数据传递给组件。但我想避免这种情况,原因有二:首先,组件应该相对自给自足。如果我在其他地方使用该组件,我也不希望父组件也必须在那里缓存数据。其次,我想找到一个可以在应用程序的其他地方应用的短期缓存模式。我并不是唯一一个这样做的人,我想保持代码清洁。

1 个答案:

答案 0 :(得分:3)

最重要的是,如果你想在创建/销毁Angular组件时做一些持久性的东西,它就不能在那个组件中创建,而是在你的组件之间共享的服务中创建。

关于RxJS,您通常不必直接使用ReplaySubject,而只使用publishReplay(1, 10000)->refCount()

share()运算符只是内部使用publish()->refCount()的{​​{1}}的简写,这意味着它不会重播缓存的值。