Baseline 2024
Newly available
Die statische Methode Promise.withResolvers()
gibt ein Objekt zurück, das ein neues Promise
-Objekt sowie zwei Funktionen zur Auflösung oder Ablehnung desselben enthält, die den beiden Parametern entsprechen, die an den Executor des Promise()
-Konstruktors übergeben werden.
Keine.
RückgabewertEin einfaches Objekt mit den folgenden Eigenschaften:
promise
Ein Promise
-Objekt.
resolve
Eine Funktion, die das Promise auflöst. Für seine Semantik siehe die Referenz des Promise()
-Konstruktors.
reject
Eine Funktion, die das Promise ablehnt. Für seine Semantik siehe die Referenz des Promise()
-Konstruktors.
Promise.withResolvers()
ist exakt gleichbedeutend mit dem folgenden Code:
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
Mit der Ausnahme, dass es kürzer ist und nicht die Verwendung von let
erfordert.
Der entscheidende Unterschied bei der Verwendung von Promise.withResolvers()
ist, dass die Auflösungs- und Ablehnungsfunktionen nun im gleichen Gültigkeitsbereich wie das Promise selbst leben, anstatt einmal im Executor erstellt und verwendet zu werden. Dies kann einige fortgeschrittenere Anwendungsfälle ermöglichen, wie z.B. deren Wiederverwendung für wiederkehrende Ereignisse, insbesondere bei Streams und Warteschlangen. Dies führt auch im Allgemeinen zu weniger Verschachtelung als beim Einwickeln von viel Logik innerhalb des Executors.
Promise.withResolvers()
ist generisch und unterstützt Subklassenbildung, was bedeutet, dass es auf Subklassen von Promise
aufgerufen werden kann und das Ergebnis ein Promise des Subklasstyps enthält. Um dies zu tun, muss der Konstruktor der Subklasse die gleiche Signatur wie der Promise()
-Konstruktor implementieren â er muss eine einzelne executor
-Funktion akzeptieren, die mit den resolve
- und reject
-Callbacks als Parameter aufgerufen werden kann.
Der Anwendungsfall von Promise.withResolvers()
ist, wenn Sie ein Promise haben, das durch einen Ereignislistener aufgelöst oder abgelehnt werden soll, der nicht innerhalb des Promise-Executors umwickelt werden kann. Das folgende Beispiel transformiert einen Node.js-lesbaren Stream in ein asynchrones Iterable. Jedes promise
repräsentiert hier einen einzelnen Datenbatch, der verfügbar ist, und jedes Mal, wenn der aktuelle Batch gelesen wird, wird ein neues Promise für den nächsten Batch erstellt. Beachten Sie, wie die Ereignislistener nur einmal angehängt werden, aber tatsächlich jedes Mal eine andere Version der resolve
- und reject
-Funktionen aufrufen.
async function* readableToAsyncIterable(stream) {
let { promise, resolve, reject } = Promise.withResolvers();
stream.on("error", (error) => reject(error));
stream.on("end", () => resolve());
stream.on("readable", () => resolve());
while (stream.readable) {
await promise;
let chunk;
while ((chunk = stream.read())) {
yield chunk;
}
({ promise, resolve, reject } = Promise.withResolvers());
}
}
Aufruf von withResolvers() auf einem Nicht-Promise-Konstruktor
Promise.withResolvers()
ist eine generische Methode. Sie kann auf jedem Konstruktor aufgerufen werden, der die gleiche Signatur wie der Promise()
-Konstruktor implementiert. Zum Beispiel können wir sie auf einen Konstruktor aufrufen, der console.log
als resolve
- und reject
-Funktionen an den executor
übergibt:
class NotPromise {
constructor(executor) {
// The "resolve" and "reject" functions behave nothing like the native
// promise's, but Promise.withResolvers() just returns them, as is.
executor(
(value) => console.log("Resolved", value),
(reason) => console.log("Rejected", reason),
);
}
}
const { promise, resolve, reject } = Promise.withResolvers.call(NotPromise);
resolve("hello");
// Logs: Resolved hello
Spezifikationen Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4