TaskController
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die TaskController
-Schnittstelle der Priorisierten Task-Planungs-API repräsentiert ein Controller-Objekt, das verwendet werden kann, um sowohl abzubrechen als auch die Priorität von einer oder mehreren priorisierten Aufgaben zu ändern. Wenn es nicht notwendig ist, die Task-Prioritäten zu ändern, kann stattdessen AbortController
verwendet werden.
Eine neue TaskController
-Instanz wird mithilfe des TaskController()
-Konstruktors erstellt, wobei optional eine Priorität für das zugehörige Signal (ein TaskSignal
) angegeben wird. Wenn keine Priorität angegeben wird, hat das Signal standardmäßig die Priorität "user-visible"
.
Das Signal des Controllers kann als Argument an die Scheduler.postTask()
-Methode für eine oder mehrere Aufgaben übergeben werden. Bei veränderlichen Aufgaben (nur diese) wird die Aufgabe mit der Signalpriorität initialisiert und kann später durch Aufrufen von TaskController.setPriority()
geändert werden. Bei unveränderlichen Aufgaben wird jede vom Controller initialisierte oder gesetzte Priorität ignoriert.
Aufgaben können durch Aufrufen von abort()
am Controller abgebrochen werden.
Konstruktor
TaskController()
-
Erstellt ein neues
TaskController
-Objekt, wobei optional die Priorität des zugehörigensignal
angegeben werden kann.
Instanzmethoden
Diese Schnittstelle erbt auch die Methoden ihres Elternteils, AbortController
.
TaskController.setPriority()
-
Setzt die Priorität des
signal
des Controllers und damit die Priorität aller damit verbundenen Aufgaben. Dies benachrichtigt Beobachter über die Prioritätsänderung durch das Auslösen einesprioritychange
-Ereignisses.
Instanzeigenschaften
Diese Schnittstelle erbt auch die Eigenschaften ihres Elternteils, AbortController
.
TaskController.signal
Schreibgeschützt-
Gibt eine
TaskSignal
-Objektinstanz zurück. Das Signal wird an Aufgaben übergeben, damit sie vom Controller abgebrochen oder umpriorisiert werden können. Die Eigenschaft wird vonAbortController
geerbt.
Beispiele
Hinweis: Zusätzliche "live"-Beispiele finden Sie in: Beispiele für die Priorisierte Task-Planungs-API.
Zunächst erstellen wir einen Task-Controller und setzen die Priorität seines zugehörigen Signals auf user-blocking
.
// Create a TaskController, setting its signal priority to 'user-blocking'
const controller = new TaskController({ priority: "user-blocking" });
Dann fügen wir einen Event-Listener für prioritychange
-Ereignisse hinzu (hier wird addEventListener()
aufgerufen, aber wir könnten stattdessen einen Handler TaskSignal.onprioritychange
zuweisen). Der Handler verwendet previousPolicy beim Ereignis, um die ursprüngliche Priorität zu erhalten und TaskSignal.priority
beim Ereignisziel, um die neue Priorität zu erhalten.
// 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}.`);
});
Wir können auch auf abort
-Ereignisse wie unten gezeigt hören. Dieser gleiche Ansatz würde verwendet werden, wenn der Controller ein AbortController
wäre.
controller.signal.addEventListener("abort", (event) => {
console.log("Task aborted");
});
Als nächstes posten wir die Aufgabe und übergeben das Controller-Signal im optionalen Argument. In diesem Fall ist die Aufgabe nur eine Pfeilfunktion, die das Versprechen auflöst, indem sie etwas Text zurückgibt. Wir verwenden then
und catch
, um zu behandeln, wenn die Aufgabe aufgelöst oder abgelehnt wird, wobei der Rückgabetext oder der Fehler in jedem Fall protokolliert wird. Beachten Sie, dass wir in einem späteren Codeblock die Aufgabe abbrechen, sodass tatsächlich nur der catch()
-Block ausgeführt wird!
// 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
Wir können den Controller verwenden, um die Aufgabe zu verwalten. Hier können wir die Priorität mithilfe von TaskController.setPriority()
ändern. Dies wird das zugehörige prioritychange
-Ereignis auslösen.
// Change the priority to 'background' using the controller
controller.setPriority("background");
Schließlich kann die Aufgabe durch Aufrufen von abort()
am Controller abgebrochen werden.
// Abort the task
controller.abort();
Die Konsolenausgabe dieses Beispiels wäre:
The priority changed from user-blocking to background. Task aborted Catch error: AbortError
Spezifikationen
Specification |
---|
Prioritized Task Scheduling # sec-task-controller |