Spec-Zone.ru › JavaScript

Promise.withResolvers()

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна во всех браузерах с марта 2024 года.

Статический метод Promise.withResolvers() возвращает объект, содержащий новый объект Promise и две функции для его разрешения или отклонения, соответствующие двум параметрам, передаваемым исполнителю конструктора Promise().

Синтаксис

Promise.withResolvers()

Параметры

Нет.

Возвращаемое значение

Простой объект, содержащий следующие свойства:

promise
Объект Promise.
resolve
Функция, которая разрешает промис. Для ее семантики см. справочник по конструктору Promise().
reject
Функция, которая отклоняет промис. Для ее семантики см. справочник по конструктору Promise().

Описание

Promise.withResolvers() в точности эквивалентен следующему коду:

let resolve, reject;
const promise = new Promise((res, rej) => {
  resolve = res;
  reject = rej;
});

За исключением того, что он более лаконичен и не требует использования let.

Ключевое отличие при использовании Promise.withResolvers() заключается в том, что функции разрешения и отклонения теперь находятся в той же области видимости, что и сам промис, вместо того чтобы создаваться и использоваться один раз внутри исполнителя. Это может позволить использовать некоторые более продвинутые сценарии использования, например, при повторном использовании для повторяющихся событий, особенно с потоками и очередями. Это также, как правило, приводит к меньшему количеству вложенности, чем обертывание большого количества логики внутри исполнителя.

Promise.withResolvers() является обобщенным и поддерживает подклассы, что означает, что его можно вызывать для подклассов Promise, и результат будет содержать промис типа подкласса. Для этого конструктор подкласса должен реализовывать ту же сигнатуру, что и конструктор Promise() — принимая одну функцию executor, которая может быть вызвана с параметрами resolve и reject.

Примеры

Преобразование потока в асинхронный итератор

Сценарий использования Promise.withResolvers() заключается в том, когда у вас есть промис, который должен быть разрешен или отклонен некоторым обработчиком событий, который не может быть обернут внутри исполнителя промиса. Следующий пример преобразует читаемый поток Node.js в асинхронный итератор. Каждый promise здесь представляет собой одну доступную партию данных, и каждый раз, когда текущая партия считывается, создается новый промис для следующей партии. Обратите внимание, что обработчики событий прикрепляются только один раз, но фактически вызывают разные версии функций resolve и reject каждый раз.

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());
  }
}

Вызов withResolvers() для конструктора, не являющегося Promise

Promise.withResolvers() — это обобщенный метод. Его можно вызывать для любого конструктора, который реализует ту же сигнатуру, что и конструктор Promise(). Например, мы можем вызвать его для конструктора, который передает console.log в качестве функций resolve и reject в executor:

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),
    );
  }

  static withResolvers = Promise.withResolvers;
}

const { promise, resolve, reject } = NotPromise.withResolvers();
resolve("hello");
// Logs: Resolved hello

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-promise.withResolvers

Совместимость с браузерами

Десктоп Мобильные Сервер
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
withResolvers
119
119
121
105
17.4
119
121
79
17.4
25.0
119
17.4
1.0.0
1.38
22.0.0

См. также

  • Polyfill Promise.withResolvers в core-js
  • Polyfill Promise.withResolvers от es-shims
  • Руководство по использованию промисов
  • Promise
  • Конструктор Promise()

© 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/withResolvers

Spec-Zone.ru

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