通用的空闲时间分片调度器

JS

javascript
/** * 通用的空闲时间分片调度器 * @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

typescript
/** * 通用的空闲时间分片调度器 * @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 });}