Comments (6)
Effects have no sense of value history.
When a signal is updated, it marks its consummers as dirty. When an effect that consumes a signal is markAsDirty, it will schedule itself.
This why you are observing that the effect re-run even if the signal value appears to be the same.
If you need to tree each value independently, signal are the wrong pattern and you should look at using observables.
from angular.
Effects have no sense of value history. When a signal is updated, it marks its consummers as dirty. When an effect that consumes a signal is markAsDirty, it will schedule itself. This why you are observing that the effect re-run even if the signal value appears to be the same.
If you need to tree each value independently, signal are the wrong pattern and you should look at using observables.
I wonder when is it expected for the effect to run if the signal didn't change? I mean the logic will probably execute the same as nothing actually changed.
A bit weird this is wanted...
from angular.
Effects schedule themeselves via a microtask (+ some extract behaviors in the context of components).
Your signal did change twice:
'angular
=>undefined
undefined
=>'angular'
Both those value changes mark the consumers as dirty, because the value did actually change ('angular'
=>'angular'
wouldn't have mark them as dirty).
Signals are about being notified eventually when a state is dirty, not individual value updates.
from angular.
Effects schedule themeselves via a microtask (+ some extract behaviors in the context of components).
Your signal did change twice:
'angular
=>undefined
undefined
=>'angular'
Both those value changes mark the consumers as dirty, because the value did actually change ('angular'
=>'angular'
wouldn't have mark them as dirty).Signals are about being notified eventually when a state is dirty, not individual value updates.
That's unfortunate... Like computed won't compute if there was no change at the end I thought effect should too... I still can't see a use case for it to be honest
from angular.
Computed also re-run with the same usecase.
https://stackblitz.com/edit/angular-next?file=src%2Fmain.ts
from angular.
At least it is consistent although in my opinion consistently bad.
It means for computed as state if two updates happen which result in no change the computed will still run unnecessarily and might trigger further computed runs which will be more expensive. And you can't hail out of it.
For effect you can't rely on it as a real change notifier and must take all deps as observables with distinctUntilChanged... For example emit output on computed change must be through observable and other cases too.
To sum it - this seems unexpected
from angular.
Related Issues (20)
- @else if and signals narrowing HOT 1
- Standalone component with angular element not working with prod build HOT 1
- Combination of redirecting under a primary route and route guarding a sibling route under a named outlet causes NG04013
- ESBuild (build-angular:application) with ng build --base-href not working as expected HOT 1
- `TestBed.overrideProviders` does not override providers of imported standalone directives HOT 3
- App crash when using ngFor with mapped data and a routerLinkActive directive inside the loop. HOT 2
- FetchBackend expects case sensitive 'Content-Type' HOT 5
- Docs have not the right URL for the image. HOT 1
- Change Behavior of destroyAfterEach or Add Support for destroyBeforeEach Option in TestBed Configuration HOT 2
- Documentation on Content Projection HOT 1
- useValue and useFactory providers throws error when value.constructor is null HOT 1
- Broken link to bootstrapApplication API docs
- 'Must never be called in production mode' HOT 7
- Allow transform functions into input signals HOT 1
- Internal repo tooling: use ESLint instead of the deprecated TSLint HOT 1
- this URL of tutorial creating your first Angular APP HOT 3
- ng generate @angular/core:control-flow migration removes the container reference even if it is used in component file
- Missing options in mat.icon-button-color HOT 1
- Invalid generation of secondar palette with @angular/material:m3Theme HOT 1
- Images not loading in the "Optimizing images" step
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from angular.