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 Prioritized Task Scheduling API repräsentiert ein Controller-Objekt, das verwendet werden kann, um sowohl die Ausführung abzubrechen als auch die Priorität einer oder mehrerer priorisierter Aufgaben zu ändern.
Wenn es nicht notwendig ist, die Prioritäten von Aufgaben zu ändern, kann stattdessen der AbortController
verwendet werden.
Eine neue TaskController
-Instanz wird mit dem TaskController()
-Konstruktor erstellt, wobei optional eine Priorität für das zugehörige Signal (ein TaskSignal
) angegeben werden kann.
Wird keine Priorität angegeben, hat das Signal standardmäßig eine Priorität von "user-visible"
.
Das Signal des Controllers kann als Argument an die Methode Scheduler.postTask()
für eine oder mehrere Aufgaben übergeben werden.
Bei änderbaren Aufgaben (nur) wird die Aufgabe mit der Signalpriorität initialisiert und kann später durch Aufruf von TaskController.setPriority()
geändert werden.
Für unveränderliche Aufgaben wird jede vom Controller initialisierte oder gesetzte Priorität ignoriert.
Aufgaben können durch Aufruf von abort()
am Controller abgebrochen werden.
Konstruktor
TaskController()
-
Erstellt ein neues
TaskController
-Objekt und legt optional die Priorität seines zugehörigensignal
fest.
Methoden der Instanz
Diese Schnittstelle erbt auch die Methoden ihres Elternteils, AbortController
.
TaskController.setPriority()
-
Legt die Priorität des Signals des Controllers fest und damit die Priorität aller damit verbundenen Aufgaben. Dies benachrichtigt Beobachter der Prioritätsänderung durch das Auslösen eines
prioritychange
-Ereignisses.
Eigenschaften der Instanz
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 neu priorisiert werden können. Die Eigenschaft wird vonAbortController
geerbt.
Beispiele
Hinweis: Zusätzliche "Live"-Beispiele finden Sie unter: Prioritized Task Scheduling API Examples.
Zuerst 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 auf TaskSignal.onprioritychange
zuweisen).
Der Handler verwendet previousPolicy auf dem Ereignis, um die ursprüngliche Priorität zu erhalten, und TaskSignal.priority
auf dem 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 hören, wie unten gezeigt wird.
Dieselbe Vorgehensweise würde verwendet, 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 einlöst, indem sie etwas Text zurückgibt.
Wir verwenden then
und catch
, um zu behandeln, wann die Aufgabe aufgelöst oder abgelehnt wird, und protokollieren den Rückgabetext oder den Fehler in jedem Fall.
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 mit 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 Aufruf 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 |
Browser-Kompatibilität
BCD tables only load in the browser