RxJS 结合流并使用两者的值来调用第三个
RxJS combine streams and use value of both to call a third
我有一个 Angular 2 应用程序,其中我有一个 'AlgemeneInfoService' 和一个 returns Observable 的 getAlgemeneInfo() 方法。
使用 angular-redux/store,我有一个商店,里面有一个 'Dossier' 和 'Verpleegperiode' 对象,它们都有一个 ID,AlgemeneInfoService 使用它来获取 'AlgemeneInfo' 对象。 (VerpleegperiodeId 可以为空)
我正在尝试将 ActiveAlgemeneInfo 放入状态对象中,当 Dossier 或 Verpleegperiode 的状态对象发生变化时,应该通过调用 AlgemeneInfoService 来刷新它。
我的计划是使用处理这些订阅的 ActiveAlgemeneInfoService 并有一个方法 getActiveAlgemeneInfo(),其中 returns 'selectedAlgemeneInfo' 通过订阅 ActiveAlgemeneInfo 状态对象设置:
@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() 时,Dossier 和 Verpleegperiode 与之前的请求完全相同。
我怎样才能让它工作?
您应该移动 distinctUntilChanged
- 因为它不进行 "deep" 比较 ,它只比较参考 - 对于 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]) => {
我有一个 Angular 2 应用程序,其中我有一个 'AlgemeneInfoService' 和一个 returns Observable 的 getAlgemeneInfo() 方法。
使用 angular-redux/store,我有一个商店,里面有一个 'Dossier' 和 'Verpleegperiode' 对象,它们都有一个 ID,AlgemeneInfoService 使用它来获取 'AlgemeneInfo' 对象。 (VerpleegperiodeId 可以为空)
我正在尝试将 ActiveAlgemeneInfo 放入状态对象中,当 Dossier 或 Verpleegperiode 的状态对象发生变化时,应该通过调用 AlgemeneInfoService 来刷新它。
我的计划是使用处理这些订阅的 ActiveAlgemeneInfoService 并有一个方法 getActiveAlgemeneInfo(),其中 returns 'selectedAlgemeneInfo' 通过订阅 ActiveAlgemeneInfo 状态对象设置:
@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() 时,Dossier 和 Verpleegperiode 与之前的请求完全相同。
我怎样才能让它工作?
您应该移动 distinctUntilChanged
- 因为它不进行 "deep" 比较 ,它只比较参考 - 对于 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]) => {