Angular:结合AsyncSubject和BehaivorSubject的功能

时间:2017-08-22 09:47:45

标签: angular rxjs

我的应用程序中的用户可以拥有汽车列表,并可以将一辆汽车激活。登录进程后,我向服务器发出请求并获得活动汽车。此外,当用户已登录(令牌尚未过期)并打开应用程序(或通过F5刷新页面)时,我还从服务器加载活动汽车。问题是我有很多需要使用print(B.Col1.values.__mul__) <method-wrapper '__mul__' of numpy.ndarray object at 0x1154d9620> 的地方。第一个明显的解决方案是使用currentCar。所以,在我的服务中,我有:

BehaviorSubject

然后,在构造函数中,我获取数据并将值赋给public currentCar$: BehaviorSubject<Car> = new BehaviorSubject(null);

然后,在某些组件中我使用它:

currentCar$

我在我的组件中经常使用这段代码,我总是要检查是否定义了汽车(请求已经完成)(默认空值)。 所以,我想等到请求完成,对于这种情况,我可以使用 this.carService.currentCar$ .subscribe(car=> { if(car) {//do what we need} } 。它工作正常,但是,正如我所说,用户有UI可以更改当前的汽车。更改后,我需要为AsyncSubject分配新值,但currentCar$不执行任何操作,因为next必须在请求完成后完成。所以,我需要AsynSubjectAsyncSubject的某种组合。是否有一些运营商或其他方式?

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

1 个答案:

答案 0 :(得分:1)

您似乎可以使用与ReplaySubject(1)链接的take(1)代替。

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

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

然后,当您想要访问汽车时,您将始终致电:

this.carService.currentCar$.take(1)
  .subscribe(car=> {
     ...
  })