JS
/** * 通用的空闲时间分片调度器 * @param {Function} task - 每次空闲时间要执行的任务逻辑 * @param {Function} condition - 判断是否继续执行的条件(返回 true 则继续,返回 false 则停止) * @param {Number} timeout */function idleScheduler(task, condition, timeout = 2000) { function step(deadline) { // 只要外部条件允许,并且(浏览器还有空闲时间 OR 已经触发超时),就执行任务 while (condition() && (deadline.timeRemaining() > 0 || deadline.didTimeout)) { task(); } // 如果外部条件依然允许,就继续申请下一次空闲时间 if (condition()) { requestIdleCallback(step, { timeout }); } else { console.log('任务已全部完成!'); } } // 启动第一次调度 requestIdleCallback(step, { timeout });}
TS
/** * 通用的空闲时间分片调度器 * @param task - 每次空闲时间要执行的任务逻辑 * @param condition - 判断是否继续执行的条件(返回 true 则继续,返回 false 则停止) * @param timeout - 强制执行的超时时间(毫秒) */function idleScheduler( task: () => void, condition: () => boolean, timeout: number = 2000): void { function step(deadline: IdleDeadline): void { // 只要外部条件允许,并且(浏览器还有空闲时间 OR 已经触发超时),就执行任务 while (condition() && (deadline.timeRemaining() > 0 || deadline.didTimeout)) { task(); } // 如果外部条件依然允许,就继续申请下一次空闲时间 if (condition()) { requestIdleCallback(step, { timeout }); } else { console.log('任务已全部完成!'); } } // 启动第一次调度 requestIdleCallback(step, { timeout });}