fix: show `:then` block for `null` value

fixes #14439

This bug was introduced in #13642 because setting the input to `null` means the equality check ("is the input different") fails if you set the value to `null`
pull/14440/head
Simon Holthausen 2 years ago
parent 4f0dde5207
commit 142f60044e

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: show `:then` block for `null` value

@ -14,6 +14,7 @@ import {
} from '../../runtime.js';
import { hydrate_next, hydrate_node, hydrating } from '../hydration.js';
import { queue_micro_task } from '../task.js';
import { UNINITIALIZED } from '../../../../constants.js';
const PENDING = 0;
const THEN = 1;
@ -40,7 +41,7 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) {
/** @type {any} */
var component_function = DEV ? component_context?.function : null;
/** @type {V | Promise<V> | null} */
/** @type {V | Promise<V> | typeof UNINITIALIZED} */
var input;
/** @type {Effect | null} */
@ -156,8 +157,8 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) {
update(THEN, false);
}
// Set the input to null, in order to disable the promise callbacks
return () => (input = null);
// Set the input to something else, in order to disable the promise callbacks
return () => (input = UNINITIALIZED);
});
if (hydrating) {

@ -1,9 +1,28 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
import { ok, test } from '../../test';
export default test({
solo: true,
compileOptions: {
dev: true
},
test() {}
test({ assert, target }) {
const [btn1, btn2] = target.querySelectorAll('button');
const p = target.querySelector('p');
ok(p);
assert.htmlEqual(p.outerHTML, `<p>0</p>`);
btn1.click();
flushSync();
assert.htmlEqual(p.outerHTML, `<p>1</p>`);
btn2.click();
flushSync();
assert.htmlEqual(p.outerHTML, `<p></p>`);
btn1.click();
flushSync();
assert.htmlEqual(p.outerHTML, `<p>1</p>`);
}
});

@ -1,9 +1,14 @@
<script>
let count = $state(43);
let count = $state(0);
</script>
{#await count}
loading
{:then count}
{count}
{/await}
<button onclick={() => count += 1}>increment</button>
<button onclick={() => count = null}>nullify</button>
<p>
{#await count}
loading
{:then count}
{count}
{/await}
</p>

Loading…
Cancel
Save