Scheduling: isInputPending() 方法
Scheduling 接口的 isInputPending() 方法允许您检查事件队列中是否存在待处理的输入事件,这表明用户正试图与页面进行交互。
此功能在您有一个任务队列需要运行,并且希望定期将控制权交还给主线程以允许用户交互发生的情况下非常有用,从而使应用程序保持尽可能响应和高性能。isInputPending() 允许您仅在有待处理输入时才交还控制权,而不是必须在任意间隔执行此操作。
警告: isInputPending() 方法已被 Scheduler 接口中的功能(如 yield())取代,这些功能在处理调度任务方面设计得更好。有关更多详细信息,请参阅 不要使用 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 |
浏览器兼容性
加载中…
另见
Scheduler接口- Prioritized Task Scheduling API
- Faster input events with Facebook's first browser API contribution (engineering.fb.com, 2019)
- Better JS scheduling with isInputPending() (developer.chrome.com, 2020)
- web.dev 上的优化长任务 (2022)