Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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.

AbortController TaskController

Konstruktor

TaskController()

Erstellt ein neues TaskController-Objekt, wobei optional die Priorität des zugehörigen signal angegeben wird.

Instanzmethoden

Dieses Interface übernimmt auch die Methoden seines Elternteils, AbortController.

TaskController.setPriority()

Setzt die Priorität des signal des 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 eines prioritychange Ereignisses.

Instanzeigenschaften

Dieses Interface übernimmt auch die Eigenschaften seines Elternteils, AbortController.

TaskController.signal Schreibgeschützt

Gibt eine Instanz des TaskSignal Objekts zurück. Das Signal wird an Aufgaben übergeben, damit sie vom Controller abgebrochen oder neu priorisiert werden können. Diese Eigenschaft wird von AbortController geerbt.

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.

js
// 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.

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}.`);
});

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.

js
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!

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

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.

js
// Change the priority to 'background' using the controller
controller.setPriority("background");

Schließlich kann die Aufgabe durch Aufruf von abort() am Controller abgebrochen werden.

js
// 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