fix: advance hydration before skipping settled async blocks (#17539)

* fix: advance hydration before skipping settled async blocks

* add test sample

* simplify
pull/17551/head
David 8 months ago committed by GitHub
parent efcb7353bb
commit 5e0d18d210

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: hydration failing with settled async blocks

@ -19,6 +19,12 @@ import { get_boundary } from './boundary.js';
* @param {(anchor: TemplateNode, ...deriveds: Value[]) => void} fn
*/
export function async(node, blockers = [], expressions = [], fn) {
var was_hydrating = hydrating;
if (was_hydrating) {
hydrate_next();
}
if (expressions.length === 0 && blockers.every((b) => b.settled)) {
fn(node);
return;
@ -31,11 +37,7 @@ export function async(node, blockers = [], expressions = [], fn) {
boundary.update_pending_count(1);
batch.increment(blocking);
var was_hydrating = hydrating;
if (was_hydrating) {
hydrate_next();
var previous_hydrate_node = hydrate_node;
var end = skip_nodes(false);
set_hydrate_node(end);

@ -0,0 +1,14 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
skip_mode: ['server'],
skip_no_async: true,
ssrHtml: `<div>1</div><p>after</p>`,
async test({ assert, target }) {
await tick();
assert.htmlEqual(target.innerHTML, '<div>1</div><p>after</p>');
}
});

@ -0,0 +1,13 @@
<script>
const n = $derived(await Promise.resolve(1));
</script>
{#snippet child(n)}
<div>{n}</div>
{/snippet}
{#if n}
{@render child(n)}
{/if}
<p>after</p>
Loading…
Cancel
Save