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)
- Page not found in documentation on Vite HOT 2
- Infinite money glitch HOT 1
- Update docs to add context on how invalid HTML breaks hydration and how to detect it automatically HOT 1
- Diagram does not match description HOT 2
- ERROR Error: ASSERTION ERROR: Expecting LContainer [Expected=> null !== null <=Actual] HOT 2
- Angular.dev is missing a lot of information HOT 1
- Not able to view https://angular.dev/tools/cli/esbuild HOT 1
- Missing https://angular.dev/errors/NG0913 site
- Directive composition: Composed directive should be able to set inputs of constituent directives
- Angular compilation failing after migrating to V16 HOT 5
- https://angular.dev/api/localize/init/$localize HOT 1
- `effect()` should have an option to run outside of an injection context HOT 3
- adev: API should show the alias of inputs and outputs
- While migrations the - angular version 8 to 10 I am facing the issue HOT 1
- Error link reported by ag HOT 1
- Component under @defer can not find injected services - R3InjectorError(DeferBlock Injector) error. HOT 1
- Vulnerability in package: @angular/localize > fast-glob > micromatch > braces HOT 1
- list of complete pipes link does not work HOT 1
- Fixit: Land #55183 to fix `this.` in templates
- Inect not working in normal function HOT 1
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.