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 вы напишете, тем более производительным он будет.»
- Тезисы: