跳到主要内容

调度器发布任务

貌似是为了兼容 Chrome 的新功能 Scheduler,该功能是浏览器自带的任务优先级

危险

该 API 仍处于实验性阶段,且暂时在 Safari 及 Safari On IOS 、 WebView on IOS 中不可用。

一、 保存本地 API

// Capture local references to native APIs, in case a polyfill overrides them.
// 捕获对本地 API 的本地引用,以防止 polyfill 覆盖它们。
const perf = window.performance;
const setTimeout = window.setTimeout;

二、 使用实验性的 Chrome 的 Scheduler postTask

// Use experimental Chrome Scheduler postTask API.
const scheduler = global.scheduler;

const getCurrentTime: () => DOMHighResTimeStamp = perf.now.bind(perf);

export const unstable_now = getCurrentTime;

三、 让出线程

// Scheduler periodically yields in case there is other work on the main
// 调度器会定期让出执行权,以防主线程上有其他工作,比如用户事件
// thread, like user events. By default, it yields multiple times per frame.
// It does not attempt to align with frame boundaries, since most tasks don't
// 默认情况下,它每帧会让出多次。
// 它不会尝试与帧边界对齐,因为大多数任务不需要与帧对齐;
// need to be frame aligned; for those that do, use requestAnimationFrame.
// 对于需要对齐的任务,可以使用 requestAnimationFrame。
const yieldInterval = 5;
let deadline = 0;

let currentPriorityLevel_DEPRECATED: PriorityLevel = NormalPriority;

// Always yield at the end of the frame.
// 总是在帧结束时让出。
export function unstable_shouldYield(): boolean {
return getCurrentTime() >= deadline;
}

export function unstable_requestPaint() {
// Since we yield every frame regardless, `requestPaint` has no effect.
}
提示

未完善(待补充)