From f39ef2a507c9268c42067b47577da43a9f7b18e2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 17 Mar 2024 22:39:04 -0400 Subject: [PATCH] fix --- .../src/internal/client/dom/blocks/await.js | 28 +++++++++++++++---- .../svelte/src/internal/client/runtime.js | 5 ++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/await.js b/packages/svelte/src/internal/client/dom/blocks/await.js index 4873898b03..3376ecfef5 100644 --- a/packages/svelte/src/internal/client/dom/blocks/await.js +++ b/packages/svelte/src/internal/client/dom/blocks/await.js @@ -6,9 +6,15 @@ import { current_component_context, flushSync, set_current_component_context, - set_current_effect + set_current_effect, + set_current_reaction } from '../../runtime.js'; -import { pause_effect, render_effect, resume_effect } from '../../reactivity/effects.js'; +import { + destroy_effect, + pause_effect, + render_effect, + resume_effect +} from '../../reactivity/effects.js'; /** @returns {import('../../types.js').AwaitBlock} */ export function create_await_block() { @@ -115,6 +121,7 @@ export function await_block(anchor_node, get_input, pending_fn, then_fn, catch_f resume_effect(then_effect); } else if (then_fn) { set_current_effect(branch); + set_current_reaction(branch); // TODO do we need both? set_current_component_context(component_context); then_effect = render_effect( () => then_fn(anchor_node, value), @@ -122,6 +129,7 @@ export function await_block(anchor_node, get_input, pending_fn, then_fn, catch_f true ); set_current_component_context(null); + set_current_reaction(null); set_current_effect(null); } } @@ -168,11 +176,19 @@ export function await_block(anchor_node, get_input, pending_fn, then_fn, catch_f }); } + // TODO it should really be this, but the `input` will never update + // if (then_effect) { + // resume_effect(then_effect); + // } else if (then_fn) { + // then_effect = render_effect(() => then_fn(anchor_node, input), (then_block = {}), true); + // } + if (then_effect) { - resume_effect(then_effect); - } else if (then_fn) { - // TODO we need to pass a function in rather than a value, because - // this will never update + destroy_effect(then_effect); + if (then_block?.d) remove(then_block.d); + } + + if (then_fn) { then_effect = render_effect(() => then_fn(anchor_node, input), (then_block = {}), true); } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 3968d2e854..b02a752ec1 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -54,6 +54,11 @@ let flush_count = 0; /** @type {null | import('./types.js').Reaction} */ export let current_reaction = null; +/** @param {null | import('./types.js').Reaction} reaction */ +export function set_current_reaction(reaction) { + current_reaction = reaction; +} + /** @type {null | import('./types.js').Effect} */ export let current_effect = null;