Promise.withResolvers

Статический метод Promise.withResolvers создаёт Promise и сразу выдаёт наружу resolve и reject, не требуя new Promise и внешних переменных под колбэки.

Что это / Зачем

В классическом коде, чтобы получить resolve/reject наружу, приходилось объявлять let resolve, reject; в внешнем scope и присваивать им внутри executor'а. withResolvers (ES2024) делает это за один вызов и помогает движку лучше оптимизировать создание Promise (Promise опираются на хост-среду и её очереди задач — она может оптимизировать процесс без лишних идентификаторов).

API / Синтаксис

const { promise, resolve, reject } = Promise.withResolvers;

// Эквивалент через new Promise:
let resolve, reject;
const promise = new Promise((res, rej) => {
  resolve = res;
  reject = rej;
});

Ключевые моменты

  • Возвращает объект { promise, resolve, reject }.
  • Главный кейс — когда resolve/reject нужно использовать ВНЕ executor'а (например, в Deferred-паттерне или EventEmitter-обёртках).
  • По производительности в большинстве случаев new Promise(...) и withResolvers равнозначны — после первого вызова V8 создаёт inline cache на Promise.withResolvers.
  • Первый вызов чуть медленнее из-за поиска глобального Promise и его метода.

Подводные камни

  • Не нужен в кейсах, где executor сам делает всю работу — там достаточно new Promise.
  • Деструктуризация выглядит лаконично, но иногда дороже ручного связывания (const a = arr[0]; const b = arr[1]) — это общий принцип V8, не специфично для withResolvers.

🎓 Источники

  • ⚡ [Promise.withResolvers VS new Promise — асинхронное программирование на JavaScript] · 2025-12-21 · YouTube
    • Тезисы:
      • Лаконичный код = производительный, но деструктуризация бывает дорогой.
      • Promise — это в первую очередь хост-среда, которая обеспечивает очереди задач.
      • withResolvers создан для оптимизации проброса resolve/reject во внешний scope.
      • Существенная разница только при использовании resolve/reject вне executor'а.
      • V8 small functions: маленькая функция (≈ ≤200 узлов AST) инлайнится и оптимизируется быстро.
      • У Promise.withResolvers первый вызов чуть дороже (поиск метода), потом срабатывает inline cache.
    • Цитата:

      «Промисы — это в первую очередь штука, завязанная на хост-среду, потому что именно хост-среда обеспечивает функционирование очередей задач.»

    • Цитата:

      «Ключевая основная стратегия — писать свой код максимально лаконичным. Чем меньше кода на JavaScript вы напишете, тем более производительным он будет.»

См. также