使用哪个合并运算符来收听单个源而不是第二个流源

Which merge operator to use to listen to single source and not 2nd stream source

所以我知道这个问题看似简单,其实并没有那么简单。 我尝试过的所有运算符,例如 combineLatestconcatswitchMap 都会导致差异问题。

挑战来了:

var campaignSelected$ = this.store.select(store => store.appDb.uiState.campaign.campaignSelected)
var campaignsList$ = this.store.select(store => store.msDatabase.sdk.table_campaigns);
return campaignSelected$.switchMap(i_campaignSelected => campaignsList$, (campaignId, campaigns) => {
  return 'foo';
})

所以我有两个流,我只想在第一个流 campaignSelected$ 发出时收到通知,此时我想切换并从我的第二个流 campaignsList$ 中获取数据,到目前为止一切都很好。

但是,如果稍后因为商店发生变化,campaignsList$再次发出,我会再次收到通知,我不想收到通知,因为我只关心什么时候发生变化campaignSelected$.

请记住,我的第二个流不会在我的第一个流发生变化的同时发生变化,因此诸如 concat 之类的运算符将不起作用。

现在我已经尝试了 combineLatest 和 diff merge 运算符,其中 none 就足够了,即:只需要在我的第一个流发出时收到通知,而不是在我的第二个流发出时收到通知,但是我们仍然需要从第二个流中获取数据,但当且仅当第一个流发出时。

如果您希望在第一个流发出时收到通知,而不是在第二个流发出时收到通知,您需要的是 withLatestFrom 运算符:

import 'rxjs/add/operator/withLatestFrom';

var campaignSelected$ = this.store.select(
  store => store.appDb.uiState.campaign.campaignSelected
);
var campaignsList$ = this.store.select(
  store => store.msDatabase.sdk.table_campaigns
);
return campaignSelected$.withLatestFrom(
  campaignsList$,
  (campaignId, campaigns) => { ... }
);