调度:isInputPending() 方法

实验性: 这是一个 实验性技术
在生产环境中使用之前,请仔细查看 浏览器兼容性表格

Scheduling 接口的 isInputPending() 方法允许您检查事件队列中是否存在待处理的输入事件,这表明用户正在尝试与页面交互。

此功能在您需要运行一系列任务,并且希望定期向主线程让步以允许用户交互发生的情况下非常有用,从而使应用程序保持尽可能的响应和高性能。isInputPending() 允许您仅在有待处理的输入时让步,而不是必须以任意间隔进行让步。

isInputPending() 通过 navigator.scheduling.isInputPending() 调用。

语法

js
isInputPending()
isInputPending(options)

参数

options 可选

一个提供选项的对象。当前,唯一的选项是

includeContinuous 可选

一个布尔值,默认值为 false。如果设置为 true,则表示在检查待处理的输入时应考虑连续事件。连续事件是可信事件(由浏览器派发的事件),它们依次触发,例如 mousemovewheeltouchmovedragpointermovepointerrawupdate

返回值

一个布尔值,表示事件队列中是否存在待处理的输入事件(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 的浏览器中加载。

另请参阅