任务控制器
**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");
});
接下来,我们发布任务,将控制器信号作为可选参数传递。 在这种情况下,任务只是一个箭头函数,它通过返回一些文本来解析承诺。 我们使用 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 |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。