ngrx 选择器 return 多次使用相同的值

ngrx selector return same values multiple times

我有一个

export const selectIDs = creteSelector(
    selectorFeature,
    (feature: Feature) => {
        return feature?.metadata?.ids || []
    }
}

在我的组件中

this.store.select(selectIDs).subscribe((ids) => dosomething(ids))

当系统启动时,功能是 undefined,因此 [] 被传递到回调中。然后功能更改为正常值,但 .metadata 不可用,因此 select returns [] 与上次结果相同,因此不应调用 dosomething() 回调.但它实际上在我的代码中用 []

再次调用

我的问题是,如果两次 select 或 returns 一次 [],回调(subscribe 中的那些调用)不应该被调用一次吗?

或者通常我的意思是如果我这样做:

this.store.select(featueSelector).subscribe((feature) => console.log(feature)

假设全局状态改变了 10 次,但特征保持不变所以 featureSelector returns 相同的特征,console.log() 会被调用 10 次吗?我想 console.log() 只会在什么特征 select 或 returns 与上次不同时被调用?

谢谢

===================更新============= 结果是 this.store.select() returns 一个 observable,所以当 obserable 调用 next() 时,console.log() 将被调用。

Ngrx select或者memorize的意思是直接returns如果输入相同,则相同的值。

再次触发选择器,并 return 编辑了一个新的数组实例。 因为 [] === [] 是假的,所以新实例被传递给订阅方法。

作为解决方法,您可以:

  • 过滤我们的空数组:this.store.select().pipe(filter(arr => arr.length > 0 )).subscribe())
  • 使用不同的运算符:this.store.select().pipe(distinct(insertCheckHere)).subscribe())
  • 我认为您还可以在选择器中创建变量 const empty = [] 和 return empty 而不是 []