TaskController

可用性有限

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

注意:此功能在 Web Workers 中可用。

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");
});

接下来,我们发布任务,在可选参数中传递控制器信号。在这种情况下,任务只是一个返回 some text 的箭头函数。我们使用 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

浏览器兼容性