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
而不是 []
我有一个
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 = []
和 returnempty
而不是[]