gpt4 book ai didi

angularjs - share() vs ReplaySubject : Which one, 都不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:43 24 4
gpt4 key购买 nike

我正在尝试在我的 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(服务中)

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——它们返回相同的数据,并且在包含该组件的行网格中,数据将是相同的。我可以在创建网格时调用它一次,然后将该数据传递到组件中。但我想避免这种情况,原因有二:首先,组件应该相对自给自足。如果我在别处使用该组件,我不希望父组件也必须在那里缓存数据。其次,我想找到一种可以应用于应用程序其他地方的短期缓存模式。我不是唯一从事此工作的人,我想保持代码干净。

最佳答案

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

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

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

关于angularjs - share() vs ReplaySubject : Which one, 都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262448/

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