Skip to content

Commit 7907d1d

Browse files
committed
await derived in module
1 parent 3dd1d30 commit 7907d1d

File tree

4 files changed

+109
-0
lines changed

4 files changed

+109
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script>
2+
import { create_derived } from './state.svelte.js';
3+
4+
let { promise, num } = $props();
5+
6+
let derived = await create_derived(
7+
() => promise,
8+
() => num
9+
);
10+
11+
$effect(() => {
12+
console.log(`$effect ${derived.value} ${num}`);
13+
});
14+
15+
$effect.pre(() => {
16+
console.log(`$effect.pre ${derived.value} ${num}`);
17+
});
18+
</script>
19+
20+
<p>{derived.value}{console.log(`template ${derived.value} ${num}`)}</p>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { flushSync, tick } from 'svelte';
2+
import { deferred } from '../../../../src/internal/shared/utils.js';
3+
import { test } from '../../test';
4+
5+
/** @type {ReturnType<typeof deferred>} */
6+
let d;
7+
8+
export default test({
9+
html: `<p>pending</p>`,
10+
11+
get props() {
12+
d = deferred();
13+
14+
return {
15+
promise: d.promise,
16+
num: 1
17+
};
18+
},
19+
20+
async test({ assert, target, component, logs }) {
21+
d.resolve(42);
22+
await Promise.resolve();
23+
await Promise.resolve();
24+
await Promise.resolve();
25+
await Promise.resolve();
26+
await Promise.resolve();
27+
await Promise.resolve();
28+
await Promise.resolve();
29+
flushSync();
30+
await tick();
31+
assert.htmlEqual(target.innerHTML, '<p>42</p>');
32+
33+
component.num = 2;
34+
await Promise.resolve();
35+
await Promise.resolve();
36+
await Promise.resolve();
37+
await tick();
38+
assert.htmlEqual(target.innerHTML, '<p>84</p>');
39+
40+
d = deferred();
41+
component.promise = d.promise;
42+
await tick();
43+
assert.htmlEqual(target.innerHTML, '<p>pending</p>');
44+
45+
d.resolve(43);
46+
await Promise.resolve();
47+
await Promise.resolve();
48+
await tick();
49+
assert.htmlEqual(target.innerHTML, '<p>86</p>');
50+
51+
assert.deepEqual(logs, [
52+
'outside boundary 1',
53+
'$effect.pre 42 1',
54+
'template 42 1',
55+
'$effect 42 1',
56+
'outside boundary 2',
57+
'$effect.pre 84 2',
58+
'template 84 2',
59+
'$effect 84 2',
60+
'$effect.pre 86 2',
61+
'template 86 2',
62+
'$effect 86 2'
63+
]);
64+
}
65+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script>
2+
import Child from './Child.svelte';
3+
4+
let { promise, num } = $props();
5+
</script>
6+
7+
<svelte:boundary>
8+
<Child {promise} {num} />
9+
10+
{#snippet pending()}
11+
<p>pending</p>
12+
{/snippet}
13+
</svelte:boundary>
14+
15+
{console.log(`outside boundary ${num}`)}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export async function create_derived(get_promise, get_num) {
2+
let value = $derived((await get_promise()) * get_num());
3+
4+
return {
5+
get value() {
6+
return value;
7+
}
8+
};
9+
}

0 commit comments

Comments
 (0)