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]) => {