调度器发布任务
貌似是为了兼容 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.
}
提示
未完善(待补充)