使用哪个合并运算符来收听单个源而不是第二个流源
Which merge operator to use to listen to single source and not 2nd stream source
所以我知道这个问题看似简单,其实并没有那么简单。
我尝试过的所有运算符,例如 combineLatest
、concat
和 switchMap
都会导致差异问题。
挑战来了:
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) => { ... }
);
所以我知道这个问题看似简单,其实并没有那么简单。
我尝试过的所有运算符,例如 combineLatest
、concat
和 switchMap
都会导致差异问题。
挑战来了:
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) => { ... }
);