调度:isInputPending() 方法
Scheduling
接口的 isInputPending()
方法允许您检查事件队列中是否存在待处理的输入事件,这表明用户正在尝试与页面交互。
此功能在您需要运行一系列任务,并且希望定期向主线程让步以允许用户交互发生的情况下非常有用,从而使应用程序保持尽可能的响应和高性能。isInputPending()
允许您仅在有待处理的输入时让步,而不是必须以任意间隔进行让步。
isInputPending()
通过 navigator.scheduling.isInputPending()
调用。
语法
js
isInputPending()
isInputPending(options)
参数
options
可选-
一个提供选项的对象。当前,唯一的选项是
includeContinuous
可选-
一个布尔值,默认值为
false
。如果设置为true
,则表示在检查待处理的输入时应考虑连续事件。连续事件是可信事件(由浏览器派发的事件),它们依次触发,例如mousemove
、wheel
、touchmove
、drag
、pointermove
和pointerrawupdate
。
返回值
一个布尔值,表示事件队列中是否存在待处理的输入事件(true
)还是不存在(false
)。
示例
我们可以在任务运行器结构中使用 isInputPending()
,仅当用户尝试与页面交互时才运行 yield()
函数
js
function yield() {
return new Promise((resolve) => {
setTimeout(resolve, 0);
});
}
async function main() {
// Create an array of functions to run
const tasks = [a, b, c, d, e];
while (tasks.length > 0) {
// Yield to a pending user input
if (navigator.scheduling.isInputPending()) {
await yield();
} else {
// Shift the first task off the tasks array
const task = tasks.shift();
// Run the task
task();
}
}
}
这使您能够避免在用户积极与页面交互时阻塞主线程,从而可能提供更流畅的用户体验。但是,仅在必要时让步,我们可以在没有用户输入要处理时继续运行当前任务。这也避免了任务被放置在队列的后面,排在其他非必需的浏览器启动任务之后,这些任务是在当前任务之后排定的。
规范
规范 |
---|
早期检测输入事件 # dom-scheduling-isinputpending |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。
另请参阅
- 使用 Facebook 的第一个浏览器 API 贡献来加速输入事件 在 engineering.fb.com 上(2019 年)
- 使用 isInputPending() 改善 JS 调度 在 developer.chrome.com 上(2020 年)
- 优化长时间任务 在 web.dev 上(2022 年)