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.
Das TaskController Interface der Prioritized Task Scheduling API repräsentiert ein Controller-Objekt, das verwendet werden kann, um sowohl eine Abbruchaktion als auch eine Änderung der Priorität für eine oder mehrere priorisierte Aufgaben vorzunehmen.
Wenn es nicht erforderlich ist, die Aufgabenprioritäten zu ändern, kann stattdessen 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 wird.
Wenn keine Priorität angegeben wird, hat das Signal standardmäßig eine Priorität von "user-visible".
Das Signal des Controllers kann als Argument für die Methode Scheduler.postTask() für eine oder mehrere Aufgaben übergeben werden.
Für veränderbare 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, wobei optional die Priorität des zugehörigensignalangegeben wird.
Instanzmethoden
Dieses Interface übernimmt auch die Methoden seines Elternteils, AbortController.
TaskController.setPriority()-
Setzt die Priorität des
signaldes Controllers und damit die Priorität aller Aufgaben, mit denen es verbunden ist. Diese Benachrichtigt die Beobachter der Prioritätsänderung durch das Auslösen einesprioritychangeEreignisses.
Instanzeigenschaften
Dieses Interface übernimmt auch die Eigenschaften seines Elternteils, AbortController.
TaskController.signalSchreibgeschützt-
Gibt eine Instanz des
TaskSignalObjekts zurück. Das Signal wird an Aufgaben übergeben, damit sie vom Controller abgebrochen oder neu priorisiert werden können. Diese Eigenschaft wird vonAbortControllergeerbt.
Beispiele
Hinweis: Zusätzliche "live" Beispiele finden Sie in: 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 Ereignis-Listener für prioritychange Ereignisse hinzu (hier wird addEventListener() aufgerufen, aber wir könnten stattdessen einen Handler zu 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.
Diese Vorgehensweise würde auch verwendet, wenn der Controller ein AbortController wäre.
controller.signal.addEventListener(
"abort",
(event) => {
console.log("Task aborted");
},
{ once: true },
);
Als Nächstes veröffentlichen wir die Aufgabe und übergeben das Controllersignal im optionalen Argument.
In diesem Fall ist die Aufgabe einfach eine Pfeilfunktion, die das Versprechen durch Zurückgeben eines Textes auflöst.
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 nur der catch()-Block tatsächlich 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.
Dadurch wird das zugehörige prioritychange Ereignis ausgelöst.
// 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> |