TaskController
注意:此功能在 Web Workers 中可用。
TaskController 接口是 优先级任务调度 API 的一部分,它代表一个控制器对象,可用于中止和更改一个或多个优先级任务的 优先级。如果无需更改任务优先级,则可以使用 AbortController 代替。
使用 TaskController() 构造函数创建一个新的 TaskController 实例,并可选择性地为其关联的信号(一个 TaskSignal)指定 优先级。如果未指定,该信号默认优先级为 "user-visible"。
控制器信号可作为参数传递给一个或多个任务的 Scheduler.postTask() 方法。对于(仅)可变优先级任务,任务会根据信号的优先级进行初始化,之后可通过调用 TaskController.setPriority() 进行更改。对于不可变优先级任务,任何初始化或由控制器设置的优先级都将被忽略。
可以通过在控制器上调用 abort() 来中止任务。
构造函数
TaskController()-
创建一个新的
TaskController对象,可选择性地指定其关联signal的优先级。
实例方法
此接口还继承了其父接口 AbortController 的方法。
TaskController.setPriority()-
设置控制器的
signal的优先级,进而影响与之关联的任何任务的优先级。这会通过派发prioritychange事件来通知观察者优先级已更改。
实例属性
此接口还继承了其父接口 AbortController 的属性。
TaskController.signal只读-
返回一个
TaskSignal对象实例。该信号会传递给任务,以便任务可以被控制器中止或重新排序。此属性继承自AbortController。
示例
注意: 更多“实时”示例可在:优先级任务调度 API 示例 中找到。
首先,我们创建一个任务控制器,将其关联信号的优先级设置为 user-blocking。
// Create a TaskController, setting its signal priority to 'user-blocking'
const controller = new TaskController({ priority: "user-blocking" });
然后,我们为 prioritychange 事件添加一个事件监听器(此处调用了 addEventListener(),但我们也可以将处理程序分配给 TaskSignal.onprioritychange)。处理程序使用事件上的 previousPolicy 来获取原始优先级,并使用事件目标上的 TaskSignal.priority 来获取新优先级。
// 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,则会使用相同的处理方式。
controller.signal.addEventListener("abort", (event) => {
console.log("Task aborted");
});
接下来,我们发布任务,在可选参数中传递控制器信号。在这种情况下,任务只是一个返回 some text 的箭头函数。我们使用 then 和 catch 来处理任务何时解析或被拒绝,并在每种情况下记录返回文本或错误。请注意,在后面的代码块中,我们会中止该任务,因此实际上只有 catch() 块会被运行!
// 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 事件。
// Change the priority to 'background' using the controller
controller.setPriority("background");
最后,可以通过在控制器上调用 abort() 来中止任务。
// Abort the task
controller.abort();
此示例的控制台输出将是:
The priority changed from user-blocking to background. Task aborted Catch error: AbortError
规范
| 规范 |
|---|
| 优先任务调度 # sec-task-controller |
浏览器兼容性
加载中…