Promise.allKeyed()
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Die statische Methode Promise.allKeyed() ähnelt Promise.all(), verwendet jedoch Objekte statt Arrays/Iterables als Eingabe/Ausgabe. Sie nimmt ein Objekt entgegen, bei dem jeder eigene Schlüssel einem Promise zugeordnet ist, und gibt ein einzelnes Promise zurück. Dieses zurückgegebene Promise wird erfüllt, wenn alle Promises der Eingabe erfüllt werden, mit einem Objekt, dessen gleiche Schlüssel den entsprechenden Erfüllungswerten zugeordnet sind. Es wird abgelehnt, wenn eines der Promises der Eingabe abgelehnt wird, mit diesem ersten Ablehnungsgrund.
Im Vergleich zu Promise.all() ermöglicht Promise.allKeyed(), Ergebnisse semantisch aussagekräftigen Schlüsseln zuzuordnen, statt einer beliebigen Array-Reihenfolge, die schwierig zu pflegen sein kann.
Syntax
Promise.allKeyed(object)
Parameter
object-
Ein Objekt. Alle seine eigenen aufzählbaren Eigenschaften, unabhängig davon, ob der Schlüssel ein String oder ein Symbol ist, sollten
Promise-Werte haben. Diese Werte werden abgewartet, sodass auch andere Thenables aufgelöst werden, während Nicht-Thenables unverändert zurückgegeben werden.
Rückgabewert
Ein Promise, das:
- Bereits erfüllt ist, wenn das übergebene
objectkeine eigenen aufzählbaren Eigenschaften hat. - Asynchron erfüllt wird, wenn alle Promises im angegebenen
objecterfüllt werden. Der Erfüllungswert ist ein Objekt mit Erfüllungswerten, mit denselben Schlüsseln in derselben Reihenfolge wie das angegebeneobject, unabhängig von der Reihenfolge der Fertigstellung. Wenn das übergebeneobjectnicht leer ist, aber keine ausstehenden Promises enthält, wird das zurückgegebene Promise dennoch asynchron (statt synchron) erfüllt. - Asynchron abgelehnt wird, wenn eines der Promises im angegebenen
objectabgelehnt wird. Der Ablehnungsgrund ist der Ablehnungsgrund des ersten Promise, das abgelehnt wurde.
Beschreibung
Die Methode Promise.allKeyed() ist eine der Methoden für Promise-Nebenläufigkeit. Sie führt dieselbe Art von Aufgabe wie Promise.all() aus. Häufig haben Sie jedoch nicht bereits ein Array von Promises, sondern nur einige Ad-hoc-Operationen, die gebündelt werden sollen. Daher legen Sie sie in ein Array und destrukturieren es anschließend sofort:
const [resultA, resultB, resultC] = await Promise.all([getA(), getB(), getC()]);
Das Problem dabei ist, dass Sie die Konsistenz der Reihenfolge auf beiden Seiten beibehalten müssen: Wenn Sie versehentlich [resultA, resultC, resultB] schreiben, wird Ihr Code nicht funktionieren.
Die schlüsselbasierte Methode mildert dieses Problem, indem jede asynchrone Operation einem semantischen Schlüssel zugeordnet wird:
const {
a: resultA,
b: resultB,
c: resultC,
} = await Promise.allKeyed({
a: getA(),
b: getB(),
c: getC(),
});
Auf diese Weise spielt die Reihenfolge keine Rolle mehr, und jede Namensabweichung ist lokal: Das versehentliche Schreiben von b: resultC ist nun viel leichter zu erkennen!
Beispiele
>Verwendung von Promise.allKeyed()
Die Methode Promise.allKeyed() nimmt ein Objekt entgegen und verarbeitet alle seine eigenen aufzählbaren Eigenschaften.
function delayed(value, timeout) {
return new Promise((res) => setTimeout(() => res(value), timeout));
}
const sym = Symbol("example");
const promises = {
a: delayed("a", 500),
// Symbol properties are processed
[sym]: delayed("symbol", 300),
// Nested properties are not processed; this whole object is treated as
// an already-resolved value and returned as-is
nested: {
b: delayed("b", 100),
},
};
const result = await Promise.allKeyed(promises);
console.log(result);
// {
// a: "a",
// [sym]: "symbol",
// nested: {
// b: <Promise>,
// },
// }
Weitere Beispiele zum Nebenläufigkeitsverhalten, das Promise.all() und Promise.allKeyed() gemeinsam haben, finden Sie unter Promise.all().
Spezifikationen
| Spezifikation |
|---|
| Await Dictionary> # sec-promise.allkeyed> |