Angular 在服务中使用BehaviorSubject?

Angular 在服务中使用BehaviorSubject?,angular,rxjs,behaviorsubject,Angular,Rxjs,Behaviorsubject,我的服务代码如下: private caseListSource = new BehaviorSubject({}); caseList$ = this.caseListSource.asObservable(); loadCaseList() { return this._httpClient.get<Case>(environment.api_url +'/cases').do(data =>{ this.caseListSource.next(dat

我的服务代码如下:

private caseListSource = new BehaviorSubject({});
caseList$ = this.caseListSource.asObservable();

loadCaseList() {
    return this._httpClient.get<Case>(environment.api_url +'/cases').do(data =>{
      this.caseListSource.next(data);

    });
目前,我正在使用
do
调用
BehaviorSubject
的下一步。有更好的方法吗?我应该在m subscribe call中调用
.next()
?我会在每个需要通知的组件中调用
next


最初我没有使用
行为主题
,但当我登录到我的应用程序并转到
选择
路径时,选择组件中的
ngOnInit将填充案例列表,我也会在另一个组件中使用它。一旦我刷新了一个页面,例如
case\2988
,案例列表将返回为未定义。

如果您只想在应用程序启动时发出一个请求,则行为主题非常有用

如果是这种情况,那么您的组件应该订阅主题:

ngOnInit() {
   this.subscription = this._caseService.caseList$
     .subscribe(data => this.caseList = data);
}
如果你不关心提出几个请求,那么你就不应该使用它


(这是我的观点和做事方式,我可能是错的,所以不要把我的话当作绝对的和唯一的真理)

你为什么要创造3个不同的观察点

private caseListSource=new BehaviorSubject({})是可观察的

caseList$=this.caseListSource.asObservable()是可观察的

返回此值。_httpClient.get(environment.api_url+'/cases')
是另一个可观察的值

只需在
loadCaseList
中返回http调用,就可以观察到http调用响应。比如:

loadCaseList() {

  return this._httpClient.get<Case>(environment.api_url +'/cases');

}

通过这种方式,您可以获得初始值,然后在调用
loadCaseList
后切换到http调用。

那么您正在使用
BehaviorSubject
作为缓存?@martin-可能,我更新了我关于初始问题的帖子。也许您可以将流(
This.\u httpClient.get…
)保存为公共属性(或通过函数公开)并放置
shareReplay(1)
操作符。当有人第一次订阅时,它将调用它,并与所有未来的订阅者共享结果。我对使用BehiavorSubject而不是在服务中使用共享变量感到有点困惑。如果我使用共享变量创建服务,甚至覆盖它们,角度组件将所以检测这些变化,那么为什么我应该使用BehiavorSubject而不是共享变量?例如,数组。我真的这样做是因为我看到的每个使用BehaviorSubject的例子都是这样做的。我更新了我的帖子,解释了为什么我开始使用一个。我更新了我的答案,以显示
开关映射
用法。caseListSource值在中没有更新您的示例,这违背了将其用作缓存的目的。我认为behavior Subject的要点是,每次发出请求时,订阅它的所有组件都会收到通知?主题也会收到通知,但我要解释的是,当您做您想做的事情时,如何将行为主题用作缓存。
loadCaseList() {

  return this._httpClient.get<Case>(environment.api_url +'/cases');

}
loadCaseList() {

  this.caseListSource = this._httpClient.get<Case>(environment.api_url +'/cases');

  return this.caseListSource;

}
private caseListSource = new BehaviorSubject({}); // creates the behaviorSubject with an initial value

loadCaseList() {

  return this.caseListSource.switchMap(() => {

    return this._httpClient.get<Case>(environment.api_url +'/cases');

  });

}