订阅Observable-Angular 10之前,在subject中存储API数据

订阅Observable-Angular 10之前,在subject中存储API数据,angular,rxjs,angular-services,Angular,Rxjs,Angular Services,我正试图用下一个方法将API返回的数据存储在行为主体中,我想在订阅observable之前这样做 假设我有一个服务,它具有从API检索一些数据的功能: getData(): Observable<Data> { return this.http.get(APIURL); } getData():可观察{ 返回this.http.get(apirl); } 现在,在订阅getData()之前,我想将API返回的内容保存在主题中。我用tap()操作符实现了这一点,但是通过阅读

我正试图用下一个方法将API返回的数据存储在行为主体中,我想在订阅observable之前这样做

假设我有一个服务,它具有从API检索一些数据的功能:

getData(): Observable<Data> {
    return this.http.get(APIURL);
}
getData():可观察{
返回this.http.get(apirl);
}
现在,在订阅getData()之前,我想将API返回的内容保存在主题中。我用tap()操作符实现了这一点,但是通过阅读文档,tap应该用于副作用,在这种情况下,它看起来不像副作用。 所以我做的是这样的:

getData(): Observable<Data> {
        return this.http.get(APIURL)
               .pipe(tap(data => this.subject.next(data));
}
getData():可观察{
返回此.http.get(APIRL)
.pipe(点击(数据=>this.subject.next(数据));
}
我这样做是为了我可以有某种缓存,这样我就不必再次调用API并在数据更新时对其进行操作。例如,假设我使用更新查询向该数据添加一个元素,现在我可以更新存储在主题中的以前的数据,以便所有内容都是最新的。只有刷新页面,我才能我会再次调用API


我不清楚的是tap操作符的用法,像这样使用它好吗,或者我尝试做的事情有更好的替代方法吗?

如果我理解正确,您可以检查一下,您在主题中是否有一些数据

subject = new BehaviorSubject<any>(null);

getData(): Observable<Data> {
   if (subject.getValue()) {
      return of(subject.getValue());
   }
   return this.http.get(APIURL)
        .pipe(tap(data => this.subject.next(data));
}
subject=newbehaviorsubject(空);
getData():可观察{
if(subject.getValue()){
返回(subject.getValue());
}
返回此.http.get(APIRL)
.pipe(点击(数据=>this.subject.next(数据));
}

如果我理解正确,您可以检查一下,您在主题中是否有一些数据

subject = new BehaviorSubject<any>(null);

getData(): Observable<Data> {
   if (subject.getValue()) {
      return of(subject.getValue());
   }
   return this.http.get(APIURL)
        .pipe(tap(data => this.subject.next(data));
}
subject=newbehaviorsubject(空);
getData():可观察{
if(subject.getValue()){
返回(subject.getValue());
}
返回此.http.get(APIRL)
.pipe(点击(数据=>this.subject.next(数据));
}
下面是一个示例,它显示了在不使用状态管理库的情况下管理缓存请求流的一种方法

演示的要点如下

接口文件{
标题:字符串;
内容:字符串;
}
@可注射({providedIn:“根”})
导出类HttpDemoCache{
//您需要一个变量来存储数据
CachedArticResponse$:BehaviorSubject=新的BehaviorSubject([]);
...
loadArticles(someQuery){
//您需要一个从BE获取数据的方法
this.httpClient.get(…).subscribe((x)=>{
此.cacheDarticResponse$.next(x);
});
}
更新文章(新文章:IArticle){
//您需要一个更新方法来将新条目发送到后端并更新您的缓存版本
this.http.post(..,{newArticle}).pipe(
开关映射(响应=>
这是我的回答$
.烟斗(
以(1)为例,
轻触(cachedArtilces=>this.cachedartilcresponse$
.next([…cachedArticles,newArticle]))
)
)
).subscribe()
});
}
}
下面是一个示例,它显示了在不使用状态管理库的情况下管理缓存请求流的一种方法

演示的要点如下

接口文件{
标题:字符串;
内容:字符串;
}
@可注射({providedIn:“根”})
导出类HttpDemoCache{
//您需要一个变量来存储数据
CachedArticResponse$:BehaviorSubject=新的BehaviorSubject([]);
...
loadArticles(someQuery){
//您需要一个从BE获取数据的方法
this.httpClient.get(…).subscribe((x)=>{
此.cacheDarticResponse$.next(x);
});
}
更新文章(新文章:IArticle){
//您需要一个更新方法来将新条目发送到后端并更新您的缓存版本
this.http.post(..,{newArticle}).pipe(
开关映射(响应=>
这是我的回答$
.烟斗(
以(1)为例,
轻触(cachedArtilces=>this.cachedartilcresponse$
.next([…cachedArticles,newArticle]))
)
)
).subscribe()
});
}

}
我不完全理解这个问题。但是如果您想在没有订阅的情况下从API更新数据,这是不可能的。Angular HttpClient是一个独特的可观察对象,在第一次通知后立即完成。因此,要保持前端更新,您需要有一个计时器来连续轮询后端在设定的时间间隔内进行数据更新或查看。它们非常容易设置,并且设计用于处理您可能面临的确切情况。我不完全理解这个问题。但是如果您想在没有订阅的情况下更新API中的数据,这是不可能的。Angular HttpClient是一个独特的可观察对象,在第一次通知。因此,要保持前端更新,您需要有一个计时器,可以在设定的时间间隔内连续轮询后端,或者查看。它们非常容易设置,设计用于处理您可能面临的确切情况。我不清楚的是tap操作符的用法,像这样使用可以吗我想做的事情有更好的选择吗?我不清楚的是tap操作符的使用,这样使用它好吗?或者我想做的事情有更好的选择吗?在服务中订阅可以吗?我不认为这通常是好的做法,但也许这是唯一的方法?只要你管理你的订阅如果没关系,您可以在本文的上下文中将服务视为一个黑匣子,负责处理外部世界中的一切(您的组件或其他服务)你只是在使用它的api,而不去摆弄它的内部。订阅服务可以吗?我不认为这是一般的好做法,但也许这是唯一的方法?只要你