diff --git a/packages/svelte/src/internal/client/dom/task.js b/packages/svelte/src/internal/client/dom/task.js index 73e88564b3..6e6e4d8d5c 100644 --- a/packages/svelte/src/internal/client/dom/task.js +++ b/packages/svelte/src/internal/client/dom/task.js @@ -1,7 +1,7 @@ import { run_all } from '../../shared/utils.js'; // Fallback for when requestIdleCallback is not available -export const request_idle_callback = +const request_idle_callback = typeof requestIdleCallback === 'undefined' ? (/** @type {() => void} */ cb) => setTimeout(cb, 1) : requestIdleCallback; @@ -11,10 +11,12 @@ let is_idle_task_queued = false; /** @type {Array<() => void>} */ let queued_boundary_microtasks = []; + /** @type {Array<() => void>} */ let queued_post_microtasks = []; + /** @type {Array<() => void>} */ -let queued_idle_tasks = []; +let idle_tasks = []; export function flush_boundary_micro_tasks() { const tasks = queued_boundary_microtasks.slice(); @@ -28,13 +30,10 @@ export function flush_post_micro_tasks() { run_all(tasks); } -export function flush_idle_tasks() { - if (is_idle_task_queued) { - is_idle_task_queued = false; - const tasks = queued_idle_tasks.slice(); - queued_idle_tasks = []; - run_all(tasks); - } +export function run_idle_tasks() { + var tasks = idle_tasks; + idle_tasks = []; + run_all(tasks); } function flush_all_micro_tasks() { @@ -71,9 +70,9 @@ export function queue_micro_task(fn) { * @param {() => void} fn */ export function queue_idle_task(fn) { - if (!is_idle_task_queued) { - is_idle_task_queued = true; - request_idle_callback(flush_idle_tasks); + if (idle_tasks.length === 0) { + request_idle_callback(run_idle_tasks); } - queued_idle_tasks.push(fn); + + idle_tasks.push(fn); } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index b352d1a75f..5048be3e2d 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -27,11 +27,7 @@ import { REACTION_IS_UPDATING, EFFECT_ASYNC } from './constants.js'; -import { - flush_idle_tasks, - flush_boundary_micro_tasks, - flush_post_micro_tasks -} from './dom/task.js'; +import { flush_boundary_micro_tasks, flush_post_micro_tasks, run_idle_tasks } from './dom/task.js'; import { internal_set } from './reactivity/sources.js'; import { destroy_derived_effects, @@ -937,7 +933,7 @@ export function flush_sync(fn) { flush_boundary_micro_tasks(); flush_post_micro_tasks(); - flush_idle_tasks(); + run_idle_tasks(); if (queued_root_effects.length > 0 || root_effects.length > 0) { flush_sync(); }