任务控制器

可用性有限

此功能不是基线,因为它在某些最广泛使用的浏览器中不起作用。

**TaskController** 接口是 优先级任务调度 API 的一部分,它表示一个控制器对象,可以用来中止和更改一个或多个优先级任务的 优先级。 如果不需要更改任务优先级,则可以使用 AbortController 来代替。

可以使用 TaskController() 构造函数创建一个新的 TaskController 实例,可以选择指定与其相关联的信号(一个 TaskSignal)的 优先级。 如果未指定,则信号默认将具有 "user-visible" 优先级。

控制器信号可以作为参数传递给 Scheduler.postTask() 方法,用于一个或多个任务。 对于 可变任务(仅),任务使用信号优先级进行初始化,并且可以通过调用 TaskController.setPriority() 在以后进行更改。 对于不可变任务,控制器初始化或设置的任何优先级都会被忽略。

可以通过在控制器上调用 abort() 来中止任务。

AbortController TaskController

构造函数

TaskController()

创建一个新的 TaskController 对象,可以选择指定其关联的 signal 的优先级。

实例方法

此接口还继承了其父级 AbortController 的方法。

TaskController.setPriority()

设置控制器 signal 的优先级,从而设置与之关联的任何任务的优先级。 这通过分派 prioritychange 事件来通知优先级更改的观察者。

实例属性

此接口还继承了其父级 AbortController 的属性。

TaskController.signal 只读

返回一个 TaskSignal 对象实例。 将信号传递给任务,以便控制器可以中止或重新设置它们的优先级。 此属性继承自 AbortController

示例

**注意:**可以在以下位置找到更多“实时”示例:优先级任务调度 API 示例

首先,我们创建一个任务控制器,将与其相关联的信号的优先级设置为 user-blocking

js
// Create a TaskController, setting its signal priority to 'user-blocking'
const controller = new TaskController({ priority: "user-blocking" });

然后,我们为 prioritychange 事件添加一个事件监听器(此处调用了 addEventListener(),但我们也可以将一个处理程序分配给 TaskSignal.onprioritychange)。 处理程序使用事件的 previousPolicy 获取原始优先级,使用事件目标的 TaskSignal.priority 获取新的优先级。

js
// Listen for 'prioritychange' events on the controller's signal.
controller.signal.addEventListener("prioritychange", (event) => {
  const previousPriority = event.previousPriority;
  const newPriority = event.target.priority;
  console.log(`Priority changed from ${previousPriority} to ${newPriority}.`);
});

我们也可以像下面这样监听 abort 事件。 如果控制器是 AbortController,则使用相同的方法。

js
controller.signal.addEventListener("abort", (event) => {
  console.log("Task aborted");
});

接下来,我们发布任务,将控制器信号作为可选参数传递。 在这种情况下,任务只是一个箭头函数,它通过返回一些文本来解析承诺。 我们使用 thencatch 来处理任务解析或被拒绝的情况,在每种情况下记录返回的文本或错误。 请注意,在后面的代码块中,我们中止了任务,因此只有 catch() 块将实际运行!

js
// Post task using the controller's signal.
// The signal priority sets the initial priority of the task
scheduler
  .postTask(() => "Task execute", { signal: controller.signal })
  .then((taskResult) => {
    console.log(`${taskResult}`);
  }) // Aborted (won't run)
  .catch((error) => {
    console.log(`Catch error: ${error}`);
  }); // Log error

我们可以使用控制器来管理任务。 在这里,我们可以使用 TaskController.setPriority() 来更改优先级。 这将触发相关联的 prioritychange 事件。

js
// Change the priority to 'background' using the controller
controller.setPriority("background");

最后,可以通过在控制器上调用 abort() 来中止任务。

js
// Abort the task
controller.abort();

此示例的控制台输出将是

The priority changed from user-blocking to background.
Task aborted
Catch error: AbortError

规范

规范
优先级任务调度
# sec-task-controller

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。