Promise.allKeyed()
Экспериментально: Это экспериментальная технология
Тщательно проверьте таблицу совместимости с браузерами, прежде чем использовать это в продакшене.
Экспериментально: Это экспериментальная технология
Тщательно проверьте таблицу совместимости с браузерами, прежде чем использовать это в продакшене.
Статический метод Promise.allKeyed() похож на Promise.all(), за исключением того, что вместо использования массивов/итерируемых объектов в качестве входных/выходных данных, он использует объекты. Он принимает объект, где каждый собственный ключ связан с промисом, и возвращает один Promise. Этот возвращаемый промис разрешается, когда разрешаются все промисы входного объекта, возвращая объект с теми же ключами, сопоставленными с соответствующими значениями разрешения. Он отклоняется, когда любой из промисов входного объекта отклоняется, с этой первой причиной отклонения.
По сравнению с Promise.all(), Promise.allKeyed() позволяет связывать результаты с семантически значимыми ключами, а не с произвольным порядком массива, который может быть трудно поддерживать.
Синтаксис
Promise.allKeyed(object)
Параметры
-
object - Объект. Все его собственные перечисляемые свойства, независимо от того, является ли ключ строкой или символом, должны иметь значения
Promise. Эти значения ожидаются, поэтому другие thenables также разрешаются, в то время как не-thenables возвращаются как есть.
Возвращаемое значение
Promise, который:
-
Уже разрешен, если переданный
objectне имеет собственных перечисляемых свойств. -
Асинхронно разрешен, когда все промисы в заданном
objectразрешаются. Значение разрешения — это объект значений разрешения, с теми же ключами в том же порядке, что и в заданномobject, независимо от порядка завершения. Если переданныйobjectне пуст, но не содержит ожидающих промисов, возвращаемый промис все равно разрешается асинхронно (вместо синхронно). -
Асинхронно отклонен, когда любой из промисов в заданном
objectотклоняется. Причина отклонения — это причина отклонения первого отклоненного промиса.
Описание
Метод Promise.allKeyed() является одним из методов параллелизма промисов. Он выполняет ту же задачу, что и Promise.all(). Однако во многих случаях у вас уже нет массива промисов, а есть лишь несколько специальных операций для объединения, поэтому вы помещаете их в массив, а затем сразу деструктурируете:
const [resultA, resultB, resultC] = await Promise.all([getA(), getB(), getC()]);
Проблема в том, что вам необходимо поддерживать согласованность порядка с обеих сторон: если вы случайно напишете [resultA, resultC, resultB], ваш код сломается.
Метод с ключами смягчает эту проблему, связывая каждую асинхронную операцию с семантическим ключом:
const {
a: resultA,
b: resultB,
c: resultC,
} = await Promise.allKeyed({
a: getA(),
b: getB(),
c: getC(),
});
Таким образом, порядок больше не имеет значения, и любое несоответствие имен является локальным: случайно написанное b: resultC теперь гораздо легче заметить!
Примеры
Использование Promise.allKeyed()
Метод Promise.allKeyed() принимает объект и обрабатывает все его собственные перечисляемые свойства.
function delayed(value, timeout) {
return new Promise((res) => setTimeout(() => res(value), timeout));
}
const sym = Symbol();
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>,
// },
// }
Дополнительные примеры, связанные с поведением параллелизма, общим для Promise.all() и Promise.allKeyed(), смотрите в Promise.all().
Спецификации
| Спецификация |
|---|
| Await Dictionary # sec-promise.allkeyed |
Совместимость с браузерами
| Настольные | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
allKeyed |
Нет |
Нет |
155 |
Нет |
Нет |
Нет |
155 |
Нет |
Нет |
Нет |
Нет |
Нет |
? |
? |
? |
Смотрите также
- Полифил
Promise.allKeyedвcore-js - Полифил es-shims
Promise.allKeyed PromisePromise.allSettledKeyed()Promise.all()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allKeyed