Promise.try в ECMAScript 2026: упрощение асинхронного кода без try-catch
-
Promise.try - это новый статический метод в ECMAScript 2026, который упрощает работу с функциями, возвращающими как обычные значения, так и промисы. Он автоматически оборачивает результат в промис и ловит синхронные ошибки без лишнего try-catch. Это решает проблему смешивания синхронного и асинхронного кода в цепочках промисов.
С его помощью код становится чище и предсказуемее. Нет нужды гадать, вернет ли функция промис или значение. Promise.try нормализует поведение, делая обработку ошибок единой для всего потока. Полезно в API, где функции бывают разными по типу возвращаемого значения.
Что такое Promise.try и зачем он нужен
Promise.try принимает функцию и опциональные аргументы, вызывает ее синхронно и всегда возвращает промис. Если функция кидает ошибку - промис отклоняется. Если возвращает значение - промис разрешается им. Если промис - просто прокидывается дальше. Это устраняет boilerplate с Promise.resolve и ручным try-catch.
Раньше для унификации приходилось писать обертки: try { return Promise.resolve(func()) } catch { return Promise.reject(err) }. Код дублировался, особенно в утилитах вроде executeTask. Promise.try заменяет это одной строкой. Он работает синхронно в отличие от .then, что важно для оптимизации. В ECMAScript 2026 метод встроен в Promise и доступен в современных движках.
- Синтаксис:
Promise.try(func, arg1, arg2, ...)- функция вызывается с аргументами. - Автоматическая обертка: Любое значение становится fulfilled промисом.
- Ловля ошибок: Синхронные throw превращаются в rejected промис.
- Совместимость: Работает с any thenable, не только нативными промисами.
Ситуация Без Promise.try С Promise.try Синхронный успех Promise.resolve(func()) Promise.try(func) Синхронная ошибка try-catch + Promise.reject Promise.try(func).catch() Асинхронный промис func() напрямую Promise.try(func) Цепочка then Promise.resolve().then(func) Promise.try(func).then() Примеры использования в реальном коде
Представьте утилиту processValue, где одна ветка - синхронная multiplyNow, другая - асинхронная multiplyLater. Без Promise.try цепочка ломается на не-промисе. С ним все работает гладко в одной цепочке .then().catch(). Это упрощает обработку ошибок в едином месте, без отдельных try-catch для sync и async.
Код без Promise.try выглядит громоздко: нужно проверять тип возврата и оборачивать вручную. С Promise.try - просто передаем колбэк. Метод принимает аргументы, как setTimeout, что удобно для partial application. В итоге цепочки промисов становятся короче и читаемее, особенно в библиотеках или микросервисах.
function multiplyNow(x) { if (x < 0) throw new RangeError("Negative input"); return x * 5; } async function multiplyLater(x) { await new Promise(r => setTimeout(r, 10)); if (x === 42) throw new Error("Forbidden"); return x * 10; } function processValue(x) { return Promise.try(() => x % 2 === 0 ? multiplyNow(x) : multiplyLater(x)) .then(result => console.log(result)) .catch(err => console.error(err)); } processValue(4); // 20 processValue(-2); // RangeError processValue(42); // Error- Упрощение цепочек: Заменяет Promise.resolve().then() на Promise.try().
- Нюанс: Вызов синхронный, промис разрешается сразу при успехе.
- Масштабирование: Легко добавлять аргументы - Promise.try(func, arg1, arg2).
Сравнение с альтернативами и ловушки
До ECMAScript 2026 использовали userland-библиотеки вроде p-try, Bluebird.Promise.try или es6-promise-try. Они делали то же самое, но не стандартизированы. Promise.try выигрывает нативной поддержкой и производительностью. Не путайте с Promise.resolve().then(func) - там асинхронный вызов, что меняет timing.
В таблице видно различия: Promise.try оптимален для sync-first сценариев. Ловушки - если func уже промис, он не переоборачивается зря. Для async executor лучше new Promise, но try удобен для mixed API. В 2026 фича в Chrome 128+, Firefox 134+, Safari 18.2+.
Альтернатива Плюсы Минусы Когда использовать new Promise(
=> r(func()))Контроль Длинный синтаксис Только успех Promise.resolve().then(func) Простота Асинхронный вызов Микротаски p-try (npm) Раньше Зависимость До 2026 Promise.try Нативно, sync Новый Все mixed случаи - Производительность: Синхронный вызов быстрее микротасок.
- Важно: Работает на любом Promise-подобном конструкторе.
- Обработка unknown ошибок: Рекомендуется .catch с toError нормализацией.
Promise.try меняет подход к асинхронности
Метод делает JS ближе к единому async-потоку, где sync - частный случай промиса. Осталось место для тонкой настройки, как кастомные reject-обработчики или интеграция с Temporal. В реальных проектах он сократит код на 20-30% в async-утилитах.
Дальше можно подумать о комбо с Array.fromAsync или Atomics.waitAsync из той же спецификации. Promise.try - шаг к упрощению, но не панацея от всех async-болей.
- Синтаксис:
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.