From 66635c5c344e9b049fd716664ec2fac1e667f314 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 24 Jun 2025 15:11:44 -0400 Subject: [PATCH] change behaviour of `tick()` to be requestAnimationFrame-based --- packages/svelte/src/internal/client/runtime.js | 4 ++++ packages/svelte/src/reactivity/create-subscriber.js | 2 +- .../tests/runtime-runes/samples/async-attribute/_config.js | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 16b136de1a..846a4e7648 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -744,6 +744,10 @@ export function flushSync(fn) { * @returns {Promise} */ export async function tick() { + if (async_mode_flag) { + return new Promise((f) => requestAnimationFrame(() => f())); + } + await Promise.resolve(); // By calling flushSync we guarantee that any pending state changes are applied after one tick. // TODO look into whether we can make flushing subsequent updates synchronously in the future. diff --git a/packages/svelte/src/reactivity/create-subscriber.js b/packages/svelte/src/reactivity/create-subscriber.js index 491ffb45cb..892aa40dc4 100644 --- a/packages/svelte/src/reactivity/create-subscriber.js +++ b/packages/svelte/src/reactivity/create-subscriber.js @@ -69,7 +69,7 @@ export function createSubscriber(start) { subscribers += 1; return () => { - tick().then(() => { + queueMicrotask(() => { // Only count down after timeout, else we would reach 0 before our own render effect reruns, // but reach 1 again when the tick callback of the prior teardown runs. That would mean we // re-subcribe unnecessarily and create a memory leak because the old subscription is never cleaned up. diff --git a/packages/svelte/tests/runtime-runes/samples/async-attribute/_config.js b/packages/svelte/tests/runtime-runes/samples/async-attribute/_config.js index f256e6a43c..35ee7606e7 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-attribute/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-attribute/_config.js @@ -9,7 +9,7 @@ export default test({

pending

`, - async test({ assert, target, component }) { + async test({ assert, target }) { const [cool, neat, reset] = target.querySelectorAll('button'); flushSync(() => cool.click());