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