share()和ReplaySubject:哪个更好?两者都不行。

3
我正在尝试在我的Angular服务中实现短期缓存 - 多个子组件会快速创建,每个子组件都有一个HTTP调用。 我想在页面加载时缓存它们,但不是永久的。
我尝试了以下两种方法,但都没有起作用。 在这两种情况下,HTTP URL每创建一个组件实例就会被访问一次; 我想避免这种情况 - 理想情况下,在创建表格时会访问一次URL,然后缓存过期,下次需要创建组件时会重新访问URL。 我从StackOverflow的其他线程中提取了这两种技术。
share()(在服务中)
getData(id: number): Observable<MyClass[]> {
    return this._http.get(this.URL)
        .map((response: Response) => <MyClass[]>response.json())
        .share();
}

ReplaySubject (in service)

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个回答

3

最重要的是,如果您想在创建/销毁Angular组件时使某些东西持久化,它不能在该组件中创建,而必须在一个服务中创建,该服务在您的组件之间共享。

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

share()运算符只是publish()->refCount()的简写形式,它在内部使用Subject,这意味着它不会重放缓存的值。


我可能没有表达清楚(我会在帖子中更新这个信息),但是share()RelaySubject()的代码是在服务中,而调用者的代码是在组件中。 - Ari Roth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接