RxJS合并流并使用两者的值来调用第三个

RxJS合并流并使用两者的值来调用第三个

问题描述:

我有一个Angular 2应用程序,其中有一个带有返回Observable的getAlgemeneInfo()方法的'AlgemeneInfoService'。RxJS合并流并使用两者的值来调用第三个

使用angular-redux/store,我有一个商店里有一个'Dossier'和'Verpleegperiode'对象,它们都有一个Id,AlgemeneInfoService用来获取'AlgemeneInfo'对象。 (该VerpleegperiodeId可以为null)

我试图把ActiveAlgemeneInfo,应通过调用AlgemeneInfoService被刷新时的任何档案或Verpleegperiode改变状态 - 对象,在国家的对象。

我的计划是使用处理这些订阅和有一个方法getActiveAlgemeneInfo(返回“selectedAlgemeneInfo”,它被设置在订购的ActiveAlgemeneInfo状态对象的ActiveAlgemeneInfoService):

@select(state => state.dieet.activeAlgemeneInfo) 
private activeAlgemeneInfo$: Observable<AlgemeneInfo>; 

在构造服务的,我设置订阅:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$, 
    this.activeInfohosDossier$ 
) 
.distinctUntilChanged() 
.subscribe(([v, d]) => { 
    const verpleegperiodeId = v != null ? v.verpleegperiodeId : null; 
    const dossierId = d.dossierId; 
    console.log(`vp id: ${verpleegperiodeId} - d id: ${dossierId}`); 
    this._setActiveAlgemeneInfo(dossierId, verpleegperiodeId); 
}); 

this.activeAlgemeneInfo$.subscribe(algemeneInfo => this.selectedAlgemeneInfo = algemeneInfo); 

而且在服务上,我也得到了一个方法:

private _setActiveAlgemeneInfo = (dossierId: number, verpleegperiodeId: number) => { 
this._algemeneInfoService 
    .getAlgemeneInfo(dossierId, verpleegperiodeId) 
    .subscribe(algemeneInfo => this._dieetActions.selectAlgemeneInfo(algemeneInfo)); 
} 

当服务被构造和方法getActiveAlgemeneInfo()被调用:

public getActiveAlgemeneInfo =(): Observable<AlgemeneInfo> => { 
    return this.activeAlgemeneInfo$; 
} 

它只是修建垃圾http请求,而当我CONSOLE.LOG的Observable.combineLatest()时,档案和Verpleegperiode是与之前的请求完全一样。

我该如何得到这个工作?

你应该移动distinctUntilChanged - 因为它不会做“深”比较,它只是比较基准 - 和combineLatest这将永远是一个新的数组。

请尝试以下,看看是否与你的问题,有助于:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$.distinctUntilChanged(), 
    this.activeInfohosDossier$.distinctUntilChanged() 
) 
.subscribe(([v, d]) => { 

另外,您应该提供一个比较法,做执行深比较像这样:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$, 
    this.activeInfohosDossier$ 
) 
.distinctUntilChanged(_.isEqual) // from: https://lodash.com/docs/#isEqual 
.subscribe(([v, d]) => {