Skip to content

Commit f55f455

Browse files
committed
fix: improve handling of unowned derived signals (#10342)
1 parent bb883b7 commit f55f455

File tree

5 files changed

+57
-2
lines changed

5 files changed

+57
-2
lines changed

.changeset/slimy-laws-explode.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: improve handling of unowned derived signals

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,14 @@ function process_microtask() {
638638
export function schedule_effect(signal, sync) {
639639
const flags = signal.f;
640640
if (sync) {
641-
execute_effect(signal);
642-
set_signal_status(signal, CLEAN);
641+
const previously_flushing_effect = is_flushing_effect;
642+
try {
643+
is_flushing_effect = true;
644+
execute_effect(signal);
645+
set_signal_status(signal, CLEAN);
646+
} finally {
647+
is_flushing_effect = previously_flushing_effect;
648+
}
643649
} else {
644650
if (current_scheduler_mode === FLUSH_MICROTASK) {
645651
if (!is_micro_task_queued) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script context="module">
2+
class Store {
3+
all = $state([1,2,3]);
4+
d1 = $derived(this.all.filter(a => a > 2));
5+
6+
update_value(){
7+
this.all = [1,2,3,4,5];
8+
}
9+
}
10+
export const s = new Store();
11+
12+
</script>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: '<div>d2: 3</div><div>d3: 3</div><div>d4: 3</div>',
5+
skip_if_hydrate: 'permanent',
6+
7+
async test({ assert, target }) {
8+
await Promise.resolve();
9+
await Promise.resolve();
10+
assert.htmlEqual(
11+
target.innerHTML,
12+
'<div>d2: 3,4,5</div><div>d3: 3,4,5</div><div>d4: 3,4,5</div>'
13+
);
14+
}
15+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script>
2+
import {s} from "./Component.svelte";
3+
import {onMount}from "svelte";
4+
5+
let d2 = $derived(s.d1.filter(x => x > 2));
6+
let d3 = $derived(s.all.filter(x => x > 2));
7+
8+
onMount(()=>{
9+
queueMicrotask(() => {
10+
s.update_value();
11+
});
12+
});
13+
</script>
14+
15+
<div>d2: {d2.join(',')}</div>
16+
<div>d3: {d3.join(',')}</div>
17+
<div>d4: {d3.join(',')}</div>

0 commit comments

Comments
 (0)