Angular 角度:结合AsyncSubject和BehavivorSubject的功能

Angular 角度:结合AsyncSubject和BehavivorSubject的功能,angular,rxjs,Angular,Rxjs,我的应用程序中的用户可以拥有汽车列表,并且可以使一辆汽车处于活动状态。在登录过程之后,我向服务器发出请求,并获得激活的汽车。此外,当用户已经登录(令牌尚未过期)并打开应用程序(或通过F5刷新页面)时,我也会从服务器加载活动汽车。问题是我有很多地方需要使用currentCar。第一个显而易见的解决方案是使用BehaviorSubject。因此,在我的服务中,我: public currentCar$: BehaviorSubject<Car> = new BehaviorSubject

我的应用程序中的用户可以拥有汽车列表,并且可以使一辆汽车处于活动状态。在登录过程之后,我向服务器发出请求,并获得激活的汽车。此外,当用户已经登录(令牌尚未过期)并打开应用程序(或通过F5刷新页面)时,我也会从服务器加载活动汽车。问题是我有很多地方需要使用
currentCar
。第一个显而易见的解决方案是使用
BehaviorSubject
。因此,在我的服务中,我:

public currentCar$: BehaviorSubject<Car> = new BehaviorSubject(null);
我在我的组件中经常使用这段代码,我总是要检查car是否已定义(请求已完成)或未定义(默认空值)。 所以,我想等待请求完成,对于这种情况,我可以使用
AsyncSubject
。它工作得很好,但正如我所说,用户有一个用户界面,他可以在其中更改当前的汽车。更改后,我需要将新值分配给
currentCar$
,但
next
不起任何作用,因为请求完成后必须完成
AsynObject
。因此,我需要一些
AsyncSubject
behavivorSubject
的组合。是否有运营商或其他方式


另外,我不能使用本地存储,数据总是必须从服务器加载。

似乎您可以使用
ReplaySubject(1)
链接到
take(1)

在您的情况下,它的工作方式与
BehaviorSubject
相同,但所有观察者都将等待,直到它发出至少一个项目。如果以后订阅,则最新值将由
ReplaySubject
缓存

public currentCar$ = new ReplaySubject<Car>(1);

似乎您可以使用
ReplaySubject(1)
链接到
take(1)

在您的情况下,它的工作方式与
BehaviorSubject
相同,但所有观察者都将等待,直到它发出至少一个项目。如果以后订阅,则最新值将由
ReplaySubject
缓存

public currentCar$ = new ReplaySubject<Car>(1);
this.carService.currentCar$.take(1)
  .subscribe(car=> {
     ...
  })