Skip to content

Commit bbe1d73

Browse files
committed
fix: correctly set is_updating before flushing root effects
1 parent cd56c1d commit bbe1d73

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

.changeset/proud-poems-brake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: correctly set `is_updating` before flushing root effects

packages/svelte/src/internal/client/runtime.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,10 @@ function infinite_loop_guard() {
644644
}
645645

646646
function flush_queued_root_effects() {
647+
let prev_updating = is_updating_effect;
647648
try {
648649
var flush_count = 0;
650+
is_updating_effect = true;
649651

650652
while (queued_root_effects.length > 0) {
651653
if (flush_count++ > 1000) {
@@ -670,6 +672,7 @@ function flush_queued_root_effects() {
670672
}
671673
} finally {
672674
is_flushing = false;
675+
is_updating_effect = prev_updating;
673676

674677
last_scheduled_effect = null;
675678
if (DEV) {

packages/svelte/tests/signals/test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,4 +1135,45 @@ describe('signals', () => {
11351135
destroy();
11361136
};
11371137
});
1138+
1139+
test('unowned deriveds correctly update', () => {
1140+
const log: any[] = [];
1141+
1142+
return () => {
1143+
const a = state(0);
1144+
const b = state(0);
1145+
const c = derived(() => {
1146+
return $.get(a);
1147+
});
1148+
const d = derived(() => {
1149+
return $.get(b);
1150+
});
1151+
1152+
const destroy = effect_root(() => {
1153+
const e = derived(() => {
1154+
return $.get(c) === 1 && $.get(d) === 1;
1155+
});
1156+
render_effect(() => {
1157+
log.push($.get(e));
1158+
});
1159+
});
1160+
1161+
assert.deepEqual(log, [false]);
1162+
1163+
set(a, 1);
1164+
set(b, 1);
1165+
1166+
flushSync();
1167+
1168+
assert.deepEqual(log, [false, true]);
1169+
1170+
set(b, 9);
1171+
1172+
flushSync();
1173+
1174+
assert.deepEqual(log, [false, true, false]);
1175+
1176+
destroy();
1177+
};
1178+
});
11381179
});

0 commit comments

Comments
 (0)