Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(store): state stream should always return latest value even if update is queued up #1995

Merged
merged 1 commit into from
Apr 19, 2023

Conversation

arturovt
Copy link
Member

@arturovt arturovt commented Apr 16, 2023

In the current behavior the StateStream internal value (_value: T) is not set immediately since its updates are queued up due to the OrderedBehaviorSubject implementation we use. The BehaviorSubject#getValue() basically returns this._value which isn't deterministically returns latest values. This happens when one action is dispatched after another action synchronously and the last action is trying to update the state and get it immediately:

store.dispatch(new Action_1()).subscribe(() => {
  store.dispatch(new Action_2())
})

Let's say the Action_2 does the following:

action_2_handler(ctx, action) {
  ctx.patchState({ newValue: action.newValue });
  console.log(ctx.getState().newValue);
}

We would expect to see the newValue equal to action.newValue, but it will show the previous value. Because patchState update is queued up.

@bundlemon
Copy link

bundlemon bot commented Apr 16, 2023

BundleMon

Files updated (1)
Status Path Size Limits
fesm2015/ngxs-store.js
94.34KB (+260B +0.27%) 125KB / +0.5%
Unchanged files (2)
Status Path Size Limits
fesm2015/ngxs-store-operators.js
6.23KB 15KB / +0.5%
fesm2015/ngxs-store-internals.js
4.22KB 20KB / +0.5%

Total files change +260B +0.24%

Groups updated (3)
Status Path Size Limits
@ngxs/store(esm2015)[gzip]
./esm2015/**/*.js
181.33KB (+368B +0.2%) +1%
@ngxs/store(umd)[gzip]
./bundles/*.umd.js
36.63KB (+63B +0.17%) +1%
@ngxs/store(fesm2015)[gzip]
./fesm2015/*.js
25.09KB (+50B +0.19%) +1%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@bundlemon
Copy link

bundlemon bot commented Apr 16, 2023

BundleMon (NGXS Plugins)

Unchanged files (14)
Status Path Size Limits
Plugins(umd)[gzip]
storage-plugin/bundles/ngxs-storage-plugin.um
d.js
7.96KB +1%
Plugins(umd)[gzip]
router-plugin/bundles/ngxs-router-plugin.umd.
js
7.41KB +1%
Plugins(umd)[gzip]
websocket-plugin/bundles/ngxs-websocket-plugi
n.umd.js
6.92KB +1%
Plugins(umd)[gzip]
hmr-plugin/bundles/ngxs-hmr-plugin.umd.js
6.89KB +1%
Plugins(fesm2015)[gzip]
storage-plugin/fesm2015/ngxs-storage-plugin.j
s
3.64KB +1%
Plugins(umd)[gzip]
form-plugin/bundles/ngxs-form-plugin.umd.js
3.44KB +1%
Plugins(fesm2015)[gzip]
router-plugin/fesm2015/ngxs-router-plugin.js
3.09KB +1%
Plugins(umd)[gzip]
devtools-plugin/bundles/ngxs-devtools-plugin.
umd.js
2.75KB +1%
Plugins(fesm2015)[gzip]
form-plugin/fesm2015/ngxs-form-plugin.js
2.67KB +1%
Plugins(fesm2015)[gzip]
hmr-plugin/fesm2015/ngxs-hmr-plugin.js
2.65KB +1%
Plugins(fesm2015)[gzip]
websocket-plugin/fesm2015/ngxs-websocket-plug
in.js
2.59KB +1%
Plugins(umd)[gzip]
logger-plugin/bundles/ngxs-logger-plugin.umd.
js
2.53KB +1%
Plugins(fesm2015)[gzip]
devtools-plugin/fesm2015/ngxs-devtools-plugin
.js
2.17KB +1%
Plugins(fesm2015)[gzip]
logger-plugin/fesm2015/ngxs-logger-plugin.js
2.01KB +1%

No change in files bundle size

Unchanged groups (3)
Status Path Size Limits
All Plugins(esm2015)[gzip]
./-plugin/esm2015/**/.js
108.71KB +1%
All Plugins(umd)[gzip]
./-plugin/bundles/.umd.js
37.91KB +1%
All Plugins(fesm2015)[gzip]
./-plugin/fesm2015/.js
18.82KB +1%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@bundlemon
Copy link

bundlemon bot commented Apr 16, 2023

BundleMon (Integration Projects)

Files updated (3)
Status Path Size Limits
Main bundles(Gzip)
hello-world-ng13-ivy/dist-integration/main.(h
ash).js
69.8KB (+50B +0.07%) +1%
Main bundles(Gzip)
hello-world-ng14-ivy/dist-integration/main.(h
ash).js
64.86KB (+39B +0.06%) +1%
Main bundles(Gzip)
hello-world-ng12-ivy/dist-integration/main.(h
ash).js
67.95KB (+36B +0.05%) +1%

Total files change +125B +0.06%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@codeclimate
Copy link

codeclimate bot commented Apr 16, 2023

Code Climate has analyzed commit 874e079 and detected 0 issues on this pull request.

The test coverage on the diff in this pull request is 100.0% (50% is the threshold).

This pull request will bring the total coverage in the repository to 96.7% (0.0% change).

View more on Code Climate.

@markwhitfeld markwhitfeld merged commit 57f0eee into master Apr 19, 2023
@markwhitfeld markwhitfeld deleted the fix/store-order branch April 19, 2023 19:23
@markwhitfeld markwhitfeld added this to the v3.8.1 milestone May 17, 2023
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request May 21, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@ngxs/form-plugin](https://github.com/ngxs/store) | dependencies | patch | [`3.8.0` -> `3.8.1`](https://renovatebot.com/diffs/npm/@ngxs%2fform-plugin/3.8.0/3.8.1) |
| [@ngxs/storage-plugin](https://github.com/ngxs/store) | dependencies | patch | [`3.8.0` -> `3.8.1`](https://renovatebot.com/diffs/npm/@ngxs%2fstorage-plugin/3.8.0/3.8.1) |
| [@ngxs/store](https://github.com/ngxs/store) | dependencies | patch | [`3.8.0` -> `3.8.1`](https://renovatebot.com/diffs/npm/@ngxs%2fstore/3.8.0/3.8.1) |

---

### Release Notes

<details>
<summary>ngxs/store</summary>

### [`v3.8.1`](https://github.com/ngxs/store/blob/HEAD/CHANGELOG.md#&#8203;381-2023-05-16)

[Compare Source](ngxs/store@v3.8.0...v3.8.1)

-   Fix: Check if state is injectable in JIT [#&#8203;1988](ngxs/store#1988)
-   Fix: State stream should always return latest value even if update is queued up [#&#8203;1995](ngxs/store#1995)
-   Fix: Ensure `StateFactory` does not connect actions multiple times [#&#8203;2010](ngxs/store#2010)
-   Build: Add Angular 16 support [#&#8203;2008](ngxs/store#2008)
-   Refactor: Set singletons as "providedIn: root" [#&#8203;2015](ngxs/store#2015)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ni4yIiwidXBkYXRlZEluVmVyIjoiMzUuOTcuMCIsInRhcmdldEJyYW5jaCI6ImRldmVsb3AifQ==-->

Co-authored-by: cabr2-bot <cabr2.help@gmail.com>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1902
Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org>
Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants