fix: render `:catch` of `#await` block with correct key (#17769)

Fixes #17678
pull/17779/head
Simon H 2 days ago committed by GitHub
parent 8334abd626
commit 7deedc5bb4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: render `:catch` of `#await` block with correct key

@ -102,7 +102,7 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) {
(e) => {
resolve(() => {
internal_set(error, e);
branches.ensure(THEN, catch_fn && ((target) => catch_fn(target, error)));
branches.ensure(CATCH, catch_fn && ((target) => catch_fn(target, error)));
if (!catch_fn) {
// Rethrow the error if no catch block exists

@ -0,0 +1,61 @@
import { test } from '../../test';
import { tick } from 'svelte';
export default test({
async test({ assert, target }) {
const [resolveImmediate, resolveTimeout, rejectImmediate, rejectTimeout] =
target.querySelectorAll('button');
rejectTimeout.click();
await new Promise((resolve) => setTimeout(resolve, 1));
assert.htmlEqual(
target.innerHTML,
`
<button>Resolve (immediate)</button>
<button>Resolve (timeout)</button>
<button>Reject (immediate)</button>
<button>Reject (timeout)</button>
<p> err [Yeah] </p>
`
);
resolveImmediate.click();
await tick();
assert.htmlEqual(
target.innerHTML,
`
<button>Resolve (immediate)</button>
<button>Resolve (timeout)</button>
<button>Reject (immediate)</button>
<button>Reject (timeout)</button>
<p> resolved [?] </p>
`
);
resolveTimeout.click();
await new Promise((resolve) => setTimeout(resolve, 1));
assert.htmlEqual(
target.innerHTML,
`
<button>Resolve (immediate)</button>
<button>Resolve (timeout)</button>
<button>Reject (immediate)</button>
<button>Reject (timeout)</button>
<p> resolved [OK] </p>
`
);
rejectImmediate.click();
await tick();
assert.htmlEqual(
target.innerHTML,
`
<button>Resolve (immediate)</button>
<button>Resolve (timeout)</button>
<button>Reject (immediate)</button>
<button>Reject (timeout)</button>
<p> err [??] </p>
`
);
}
});

@ -0,0 +1,34 @@
<script>
let p = $state(null);
</script>
<button onclick={()=>{
p = new Promise((resolve, reject) => {
resolve("?");
});
}}>Resolve (immediate)</button>
<button onclick={()=>{
p = new Promise((resolve, reject) => {
setTimeout(() => resolve("OK"), 1);
});
}}>Resolve (timeout)</button>
<button onclick={()=>{
p = new Promise((resolve, reject) => {
reject("??");
});
}}>Reject (immediate)</button>
<button onclick={()=>{
p = new Promise((resolve, reject) => {
setTimeout(() => reject("Yeah"), 1);
});
}}>Reject (timeout)</button>
<p>
{#await p}
...
{:then v}
resolved [{v}]
{:catch err}
err [{err}]
{/await}
</p>
Loading…
Cancel
Save