Rxjs @并行发射两次的ngrx选择器
我有一个非常简单的选择器Rxjs @并行发射两次的ngrx选择器,rxjs,ngrx,Rxjs,Ngrx,我有一个非常简单的选择器 export const isLoading = createSelector( state => state.$loading ); 以及两个操作startayOutNavigationAction和EndLayoutNavigationAction,它们只是相应地设置了$loading标志。 一旦调用这些函数,我的操作就会被记录下来: ACTION – [Layout] Start navigation StartLayoutNavigationActi
export const isLoading = createSelector(
state => state.$loading
);
以及两个操作startayOutNavigationAction
和EndLayoutNavigationAction
,它们只是相应地设置了$loading
标志。
一旦调用这些函数,我的操作就会被记录下来:
ACTION – [Layout] Start navigation StartLayoutNavigationAction {layout: "login", type: "[Layout] Start navigation"}
ACTION – [Layout] End navigation EndLayoutNavigationAction {type: "[Layout] End navigation"}
因此,假设选择器在调用第一个操作时发出一次,在调用第二个操作时发出一次。中间没有动作
但是:
选择器似乎并行发射两次。我的发言如下:
layoutLoading$: Observable<boolean> = this.store.pipe(
select(isLoading),
distinctUntilChanged((x, y) => {
console.log("Comparison:", x, y);
return x === y;
}),
tap(value => console.log("New val:", value))
);
我有什么不对劲吗?这是预期的行为吗?每次状态更改时,您的选择器都将执行。这是因为它的参数是整个状态。基于注释 您确定layoutLoading$只有一个订阅吗?对于 例如,您有多个异步管道、多个组件实例。-@马车
好的,你说得对,我有两个异步订阅。我不知道 这对每个订阅都有效。所以当我想对不同的 更改(除了异步管道之外),我需要第二个 可观察到的管道,对吗@贾科莫·沃什 是的,如果我理解正确:
source$
.pipe(distinctUntilChanged(fn))
.subscribe(/* do something */)
正如您在我的日志中所看到的,只执行了一个操作,因此对状态进行了一次更改。但是选择器两次注册相同的更改,并用相同的参数执行两次。啊,我明白了,你有复制吗?我也试过你的建议,但对我不起作用。请看我的问题,它有一个复制品。似乎在初始加载时,选择器被调用了两次?您确定
layoutLoading$
有一个订阅
?例如,您有多个async
管道,多个组件实例如果您是对的,我有两个订阅async
。我不知道这对每个订阅都有效。因此,当我想要对不同的更改做出反应时(除了异步
管道之外),我需要第二个可观察管道,对吗?添加答案以结束问题(如果正确)
const source$ = of(1).pipe(
tap(value => console.log("New val:", value))
);
source$.subscribe();
source$.subscribe();
// 1
// 1
source$
.pipe(distinctUntilChanged(fn))
.subscribe(/* do something */)