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

瀏覽器相容性