Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. Web-APIs
  3. Scheduler
  4. postTask()

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

View in EnglishAlways switch to English

Scheduler: postTask() Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Hinweis: Diese Funktion ist inWeb Workers verfügbar.

DiepostTask()-Methode desScheduler-Interfaces wird verwendet, um Aufgaben gemäß ihrerPriorität zumPlanen hinzuzufügen.

Diese Methode ermöglicht es den Nutzern optional anzugeben, wie lange mindestens gewartet werden soll, bevor die Aufgabe ausgeführt wird, eine Priorität für die Aufgabe festzulegen und ein Signal anzugeben, das zur Modifikation der Aufgabenpriorität und/oder zum Abbrechen der Aufgabe verwendet werden kann.Sie gibt ein Promise zurück, das mit dem Ergebnis der Aufgabenrückruffunktion aufgelöst oder mit dem Abbruchgrund oder einem in der Aufgabe geworfenen Fehler abgelehnt wird.

Die Aufgabenpriorität kannänderbar oder unveränderbar sein.Wenn die Aufgabenpriorität sich niemals ändern soll, sollte sie über den Parameteroptions.priority festgelegt werden (dann wird jede Priorität, die über ein Signal gesetzt wurde, ignoriert).Es ist weiterhin möglich, einAbortSignal (das keine Priorität hat) oder einTaskSignal an den Parameteroptions.signal zu übergeben, um die Aufgabe abzubrechen.

Falls die Aufgabenpriorität möglicherweise geändert werden muss, darf der Parameteroptions.priority nicht gesetzt werden.Stattdessen sollte einTaskController erstellt werden und seinTaskSignal sollte anoptions.signal übergeben werden.Die Aufgabenpriorität wird von der Signalpriorität initialisiert und kann später über den zugehörigenTaskController des Signals geändert werden.

Falls keine Priorität gesetzt ist, dann hat die Aufgabe standardmäßig die Priorität"user-visible".

Ist eine Verzögerung angegeben und größer als 0, wird die Ausführung der Aufgabe für mindestens so viele Millisekunden verzögert.Andernfalls wird die Aufgabe sofort zur Priorisierung geplant.

Syntax

js
postTask(callback)postTask(callback, options)

Parameter

callback

Eine Rückruffunktion, die die Aufgabe implementiert.Der Rückgabewert des Rückrufs wird verwendet, um das Promise zu lösen, das von dieser Funktion zurückgegeben wird.

optionsOptional

Aufgabenoptionen, einschließlich:

priorityOptional

Die unveränderlichePriorität der Aufgabe.Eine der folgenden:"user-blocking","user-visible","background".Falls gesetzt, wird diese Priorität für die gesamte Lebensdauer der Aufgabe verwendet und die Priorität, die auf demsignal gesetzt ist, wird ignoriert.

signalOptional

EinTaskSignal oderAbortSignal, das verwendet werden kann, um die Aufgabe abzubrechen (von ihrem zugehörigen Controller).

Wenn der Parameteroptions.priority gesetzt ist, kann die Aufgabenpriorität nicht geändert werden, und jede Priorität auf dem Signal wird ignoriert.Andernfalls, wenn das Signal einTaskSignal ist, wird seine Priorität verwendet, um die anfängliche Aufgabenpriorität festzulegen, und der Signal-Controller kann diese später ändern.

delayOptional

Die Mindestanzahl an Millisekunden, nach der die Aufgabe zur Planerwarteschlange hinzugefügt wird.Die tatsächliche Verzögerung kann höher sein, wird aber nicht weniger sein.Die Standardverzögerung beträgt 0.

Rückgabewert

Gibt einPromise zurück, das mit dem Rückgabewert dercallback Funktion aufgelöst oder mit dem Abbruchgrund dessignals (AbortSignal.reason) abgelehnt werden kann.Das Promise kann auch mit einem während der Ausführung geworfenen Fehler abgelehnt werden.

Beispiele

Die folgenden Beispiele sind leicht vereinfachte Versionen der Live-Beispiele ausPrioritized Task Scheduling API > Examples.

Feature-Überprüfung

Überprüfen Sie, ob das priorisierte Planen von Aufgaben unterstützt wird, indem Sie diescheduler-Eigenschaft im globalen Gültigkeitsbereich testen (wie z. B.Window.scheduler im Bereich des Fensters oderWorkerGlobalScope.scheduler im Bereich des Workers).

Zum Beispiel, der folgende Code protokolliert "Feature: Supported", wenn die API in diesem Browser unterstützt wird.

js
// Check that feature is supportedif ("scheduler" in globalThis) {  console.log("Feature: Supported");} else {  console.error("Feature: NOT Supported");}

Grundlegende Verwendung

Aufgaben werden gepostet, indem eine Rückruffunktion (Aufgabe) im ersten Argument angegeben wird, und ein optionales zweites Argument, das verwendet werden kann, um eine Aufgabenpriorität, ein Signal und/oder eine Verzögerung anzugeben.Die Methode gibt einPromise zurück, das sich mit dem Rückgabewert der Rückruffunktion löst oder mit einem Abbruchfehler oder einem in der Funktion geworfenen Fehler abgelehnt wird.

Da sie ein Promise zurückgibt, kannpostTask()mit anderen Versprechen verkettet werden.Unten zeigen wir, wie man darauf wartet, dass das Promise mitthen gelöst oder mitcatch abgelehnt wird.Die Priorität ist nicht spezifiziert, daher wird die Standardprioritätuser-visible verwendet.

js
// A function that defines a taskfunction myTask() {  return "Task 1: user-visible";}// Post task with default priority: 'user-visible' (no other options)// When the task resolves, Promise.then() logs the result.scheduler  .postTask(myTask, { signal: abortTaskController.signal })  .then((taskResult) => console.log(`${taskResult}`)) // Log resolved value  .catch((error) => console.error("Error:", error)); // Log error or abort

Die Methode kann auch mitawait innerhalb einerasynchronen Funktion verwendet werden.Der folgende Code zeigt, wie man diesen Ansatz verwenden könnte, um auf eineuser-blocking Aufgabe zu warten.

js
function myTask2() {  return "Task 2: user-blocking";}async function runTask2() {  const result = await scheduler.postTask(myTask2, {    priority: "user-blocking",  });  console.log(result); // 'Task 2: user-blocking'.}runTask2();

Dauerhafte Prioritäten

Aufgabenprioritäten können durch denpriority-Parameter im optionalen zweiten Argument festgelegt werden.Prioritäten, die auf diese Weise festgelegt werden, können nicht geändert werden (sindunveränderlich).

Unten posten wir zwei Gruppen von jeweils drei Aufgaben, wobei jedes Mitglied in umgekehrter Reihenfolge der Priorität steht.Die letzte Aufgabe hat die Standardpriorität.Beim Ausführen protokolliert jede Aufgabe einfach ihre erwartete Reihenfolge (wir warten nicht auf das Ergebnis, da dies nicht notwendig ist, um die Ausführungsreihenfolge zu zeigen).

js
// three tasks, in reverse order of priorityscheduler.postTask(() => console.log("bkg 1"), { priority: "background" });scheduler.postTask(() => console.log("usr-vis 1"), {  priority: "user-visible",});scheduler.postTask(() => console.log("usr-blk 1"), {  priority: "user-blocking",});// three more tasks, in reverse order of priorityscheduler.postTask(() => console.log("bkg 2"), { priority: "background" });scheduler.postTask(() => console.log("usr-vis 2"), {  priority: "user-visible",});scheduler.postTask(() => console.log("usr-blk 2"), {  priority: "user-blocking",});// Task with default priority: user-visiblescheduler.postTask(() => {  console.log("usr-vis 3 (default)");});

Das erwartete Ergebnis wird unten gezeigt: Aufgaben werden in Prioritätsreihenfolge ausgeführt und dann in Deklarationsreihenfolge.

usr-blk 1usr-blk 2usr-vis 1usr-vis 2usr-vis 3 (default)bkg 1bkg 2

Ändern von Aufgabenprioritäten

Aufgabenprioritäten können ihre anfänglichen Werte auch von einemTaskSignal erhalten, das anpostTask() im optionalen zweiten Argument übergeben wird.Wenn sie auf diese Weise eingestellt werden, kann die Priorität der Aufgabedann geändert werden durch den Controller, der mit dem Signal verbunden ist.

Hinweis:Das Einstellen und Ändern von Aufgabenprioritäten mit einem Signal funktioniert nur, wenn dasoptions.priority-Argument fürpostTask() nicht gesetzt ist und wenn dasoptions.signal einTaskSignal (und keinAbortSignal) ist.

Der folgende Code zeigt zuerst, wie man einenTaskController erstellt und die anfängliche Priorität seines Signals imTaskController()-Konstruktor aufuser-blocking einstellt.

Wir verwenden dannaddEventListener(), um einen Ereignis-Listener zum Signal des Controllers hinzuzufügen (wir könnten alternativ dieTaskSignal.onprioritychange-Eigenschaft verwenden, um einen Ereignis-Handler hinzuzufügen).Der Ereignis-Handler verwendetpreviousPriority am Ereignis, um die ursprüngliche Priorität zu erhalten, undTaskSignal.priority am Ereignisziel, um die neue/aktuelle Priorität zu erhalten.

js
// Create a TaskController, setting its signal priority to 'user-blocking'const controller = new TaskController({ priority: "user-blocking" });// 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}.`);});

Schließlich wird die Aufgabe gepostet, indem das Signal übergeben wird, und dann ändern wir sofort die Priorität aufbackground, indem wirTaskController.setPriority() am Controller aufrufen.

js
// Post task using the controller's signal.// The signal priority sets the initial priority of the taskscheduler.postTask(() => console.log("Task 1"), { signal: controller.signal });// Change the priority to 'background' using the controllercontroller.setPriority("background");

Das erwartete Ergebnis wird unten gezeigt.Beachten Sie, dass in diesem Fall die Priorität geändert wird, bevor die Aufgabe ausgeführt wird, aber sie könnte genauso gut während der Ausführung der Aufgabe geändert worden sein.

js
// Expected output// Priority changed from user-blocking to background.// Task 1

Aufgaben abbrechen

Aufgaben können entweder mitTaskController undAbortController auf die gleiche Weise abgebrochen werden.Der einzige Unterschied besteht darin, dass SieTaskController verwenden müssen, wenn Sie auch die Aufgabenpriorität festlegen möchten.

Der folgende Code erstellt einen Controller und übergibt dessen Signal an die Aufgabe.Die Aufgabe wird dann sofort abgebrochen.Dies führt dazu, dass das Promise mit einemAbortError abgelehnt wird, der imcatch-Block abgefangen und protokolliert wird.Beachten Sie, dass wir auch dasabort Event, das auf demTaskSignal oderAbortSignal ausgelöst wird, hätten abhören und den Abbruch dort protokollieren können.

js
// Declare a TaskController with default priorityconst abortTaskController = new TaskController();// Post task passing the controller's signalscheduler  .postTask(() => console.log("Task executing"), {    signal: abortTaskController.signal,  })  .then((taskResult) => console.log(`${taskResult}`)) // This won't run!  .catch((error) => console.error("Error:", error)); // Log the error// Abort the taskabortTaskController.abort();

Aufgaben verzögern

Aufgaben können verzögert werden, indem im Parameteroptions.delay vonpostTask() eine ganze Zahl an Millisekunden angegeben wird.Dies fügt die Aufgabe effektiv mit einer Zeitüberschreitung zur priorisierten Warteschlange hinzu, wie sie mitsetTimeout() erstellt werden könnte.Diedelay ist die minimale Zeitspanne, bevor die Aufgabe dem Planer hinzugefügt wird; sie kann länger sein.

Der folgende Code zeigt zwei Aufgaben, die (als Pfeilfunktionen) mit einer Verzögerung hinzugefügt wurden.

js
// Post task as arrow function with delay of 2 secondsscheduler  .postTask(() => "Task delayed by 2000ms", { delay: 2000 })  .then((taskResult) => console.log(`${taskResult}`));scheduler  .postTask(() => "Next task should complete in about 2000ms", { delay: 1 })  .then((taskResult) => console.log(`${taskResult}`));

Spezifikationen

Specification
Prioritized Task Scheduling
# dom-scheduler-posttask

Browser-Kompatibilität

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2026 Movatter.jp