rxjsngrxngrx-selectors

ngrx selector return same values multiple times


I have a

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

in the component I have

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

When the system is up feature is undefined so [] is passed into the callback. Then feature then changes to a normal value but .metadata not available so select returns [] which is same as last result so the dosomething() call back is not supposed to be called. But it actually get called again in my code with []

My question is if both time selector returns a [], shouldn't the calllback (those calls in subscribe)be called once?

Or generally I mean if I do this:

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

suppose global state changes 10 times, but feature stays same so featureSelector returns same feature, will the console.log() be called 10 times? I imagine the console.log() will only be called when what feature selectore returns is different from last time?

Thanks

=================== updated ============= it turns out this.store.select() returns a observable, so when the obserable calls the next(), console.log() will be called.

Ngrx selector memorize means it directly returns same value if input is same.


Solution

  • The selector is fired again, and a new array instance is returned. Because [] === [] is falsy, the new instance is passed to the subscribe method.

    As a workaround, you can: