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 |
瀏覽器相容性
載入中…