Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rxjs @并行发射两次的ngrx选择器_Rxjs_Ngrx - Fatal编程技术网

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 */)