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

Eingeschränkt verfügbar

Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.

Want more browser support for this feature? Tell us why.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die TaskController-Schnittstelle der Prioritized Task Scheduling API stellt ein Controller-Objekt dar, mit dem sich eine oder mehrere priorisierte Tasks sowohl abbrechen als auch in ihrer Priorität ändern lassen. Wenn die Prioritäten von Tasks nicht geändert werden müssen, kann stattdessen AbortController verwendet werden.

Eine neue TaskController-Instanz wird mit dem Konstruktor TaskController() erstellt. Dabei kann optional eine Priorität für das zugehörige Signal (ein TaskSignal) angegeben werden. Wenn keine Priorität angegeben wird, hat das Signal standardmäßig die Priorität "user-visible".

Das Signal des Controllers kann für eine oder mehrere Tasks als Argument an die Methode Scheduler.postTask() übergeben werden. Nur bei Tasks mit veränderbarer Priorität wird der Task mit der Priorität des Signals initialisiert; diese kann später durch einen Aufruf von TaskController.setPriority() geändert werden. Bei Tasks mit unveränderlicher Priorität wird jede vom Controller festgelegte oder geänderte Priorität ignoriert.

Tasks können durch einen Aufruf von abort() auf dem Controller abgebrochen werden.

AbortController TaskController

Konstruktor

TaskController()

Erstellt ein neues TaskController-Objekt. Dabei kann optional die Priorität des zugehörigen signal angegeben werden.

Instanzeigenschaften

Diese Schnittstelle erbt außerdem die Eigenschaften ihrer übergeordneten Schnittstelle AbortController.

TaskController.signal Schreibgeschützt

Gibt eine TaskSignal-Objektinstanz zurück. Das Signal wird an Tasks übergeben, damit der Controller sie abbrechen oder ihre Priorität ändern kann. Die Eigenschaft wird von AbortController geerbt.

Instanzmethoden

Diese Schnittstelle erbt außerdem die Methoden ihrer übergeordneten Schnittstelle AbortController.

TaskController.setPriority()

Legt die Priorität des signal des Controllers fest und damit auch die Priorität aller zugehörigen Tasks. Beobachter werden über die Prioritätsänderung benachrichtigt, indem ein prioritychange-Ereignis ausgelöst wird.

Beispiele

Hinweis: Weitere interaktive Beispiele finden Sie unter Beispiele zur Prioritized Task Scheduling API.

Zunächst erstellen wir einen Task-Controller und setzen die Priorität des zugehörigen Signals auf user-blocking.

js
// Create a TaskController, setting its signal priority to 'user-blocking'
const controller = new TaskController({ priority: "user-blocking" });

Anschließend fügen wir einen Event-Listener für prioritychange-Ereignisse hinzu (hier wird addEventListener() aufgerufen; alternativ könnten wir TaskSignal.onprioritychange einen Handler zuweisen). Der Handler verwendet previousPolicy auf dem Ereignis, um die ursprüngliche Priorität zu ermitteln, und TaskSignal.priority auf dem Ereignisziel, um die neue Priorität zu ermitteln.

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

Wie unten gezeigt, können wir auch auf abort-Ereignisse reagieren. Denselben Ansatz würden wir verwenden, wenn der Controller ein AbortController wäre.

js
controller.signal.addEventListener(
  "abort",
  (event) => {
    console.log("Task aborted");
  },
  { once: true },
);

Als Nächstes planen wir den Task ein und übergeben das Signal des Controllers als optionales Argument. In diesem Fall ist der Task lediglich eine Pfeilfunktion, die das Promise durch die Rückgabe eines Textes erfüllt. Mit then und catch behandeln wir, ob der Task erfolgreich abgeschlossen oder zurückgewiesen wird, und protokollieren jeweils den zurückgegebenen Text oder den Fehler. Beachten Sie, dass wir den Task in einem späteren Codeblock abbrechen. Daher wird tatsächlich nur der catch()-Block ausgeführt!

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

Mit dem Controller können wir den Task 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 der Task durch einen Aufruf von abort() auf dem 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

Spezifikation
Prioritized Task Scheduling
# sec-task-controller

Browser-Kompatibilität