diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js index 8f195f0159..4f50d447f7 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js @@ -26,7 +26,7 @@ export function AwaitExpression(node, context) { // @ts-expect-error we could probably use a neater/more robust mechanism if (parent.metadata) break; - // TODO make this more accurate — we don't need to call suspend + // TODO make this more accurate — we don't need to call suspend // if this is the last thing that could be read preserve_context = true; } diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index cb0d45e1ed..2dfd657e34 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -283,7 +283,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f update_item(existing, value, i, flags); } } else { - var item = create_item( + item = create_item( null, state, null, diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 0e3c1196a5..1172a3a33b 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -130,14 +130,17 @@ export class Batch { batches.delete(this); for (var batch of batches) { + /** @type {Source} */ + var source; + if (batch.#id < this.#id) { // other batch is older than this - for (var source of this.#previous.keys()) { + for (source of this.#previous.keys()) { batch.#previous.delete(source); } } else { // other batch is newer than this - for (var source of batch.#previous.keys()) { + for (source of batch.#previous.keys()) { if (this.#previous.has(source)) { batch.#previous.set(source, source.v); } diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 575370af9a..314595c937 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -89,7 +89,7 @@ export function derived(fn) { /** * @template V - * @param {() => Promise} fn + * @param {() => V | Promise} fn * @param {string} [location] If provided, print a warning if the value is not read immediately after update * @returns {Promise>} */ @@ -173,12 +173,21 @@ export function async_derived(fn, location) { ); }, EFFECT_ASYNC | EFFECT_PRESERVED); - return new Promise(async (fulfil) => { - // if the effect re-runs before the initial promise - // resolves, delay resolution until we have a value - var p; - while (p !== (p = promise)) await p; - fulfil(signal); + return new Promise((fulfil) => { + /** @param {Promise} p */ + function next(p) { + p.then(() => { + if (p === promise) { + fulfil(signal); + } else { + // if the effect re-runs before the initial promise + // resolves, delay resolution until we have a value + next(promise); + } + }); + } + + next(promise); }); }