我想创建一个 ngrx
selector
selectResult$
,它仅在某个输入可观察量具有特定值时才发出值。
让我们举个例子:
export interface AppState {
data: string[];
settings: string[];
loading: boolean;
}
@Injectable()
export class AppStore extends ComponentStore<AppState> {
selectLoading$ = this.select((state) => state.loading);
selectSettings$ = this.select((state) => state.settings);
selectData$ = this.select((state) => state.data);
selectResult$ = this.select(
this.selectLoading$.pipe(filter((loading) => loading === false)),
this.selectSettings$,
this.selectData$,
(loading, settings, data) => {
console.log('emit new data');
return { loading, data, settings };
}
);
所以,我希望选择器仅在
selectLoading$
处于 loading = false
状态时发出值。
但是我无法让
selectResult$
正常工作。流程是这样的:
loading = false
loading = true
selectData$
selectResult$
立即发出一个值。但我没想到会这样,因为有这个 filter(loading => loading === false)
运算符过滤器运算符(loading === false)仅适用于 selectloading$。 即使loading === true, selectSettings$ 和 selectData$ 仍然可以发出。 这意味着,您必须过滤合并的结果。
this.selectResult$ = this.select(
this.selectLoading$,
this.selectSettings$,
this.selectData$
).pipe(
filter( (loading) => loading === false ),
map( (loading, settings, data) => ({ loading, data, settings }) ),
tap( () => console.log('emit new data') )
);
顺便说一句:使用 tap 来实现日志记录等副作用