Spec-Zone.ru › JavaScript

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
  • Promise
  • Promise.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API