Skip to content

Commit 23b38a3

Browse files
authored
fix: improve handling of unowned derived signals (#10342)
1 parent 145b233 commit 23b38a3

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
@@ -623,8 +623,14 @@ function process_microtask() {
623623
export function schedule_effect(signal, sync) {
624624
const flags = signal.f;
625625
if (sync) {
626-
execute_effect(signal);
627-
set_signal_status(signal, CLEAN);
626+
const previously_flushing_effect = is_flushing_effect;
627+
try {
628+
is_flushing_effect = true;
629+
execute_effect(signal);
630+
set_signal_status(signal, CLEAN);
631+
} finally {
632+
is_flushing_effect = previously_flushing_effect;
633+
}
628634
} else {
629635
if (current_scheduler_mode === FLUSH_MICROTASK) {
630636
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)