Promise.try в ECMAScript 2026: унификация синхронного и асинхронного кода без ошибок
-
Promise.try в ECMAScript 2026 меняет подход к работе с кодом. Этот статический метод Promise оборачивает любую функцию в промис, автоматически ловит синхронные ошибки и унифицирует синхронный и асинхронный код. Теперь не нужно вручную оборачивать вызовы в new Promise - всё происходит гладко.
Зачем это нужно? Разработчики часто сталкиваются с проблемой: синхронная функция может упасть с ошибкой, а асинхронная - вернуть промис. Promise.try решает это одной командой, делая код чище и предсказуемее. Без лишней обработки ошибок на входе вы получаете единый поток для .then() и .catch().
Как работает Promise.try
Promise.try принимает функцию и её аргументы, выполняет её и возвращает промис. Если функция синхронная и успешная - промис fulfilled с результатом. Если бросает ошибку - промис rejected. А если возвращает промис - Promise.try просто прокидывает его дальше.
Рассмотрим базовый случай. Допустим, есть функция getData(), которая иногда падает из-за неверных параметров. Без Promise.try пришлось бы писать new Promise с resolve и reject вручную. С Promise.try всё проще: один вызов, и ошибка уйдёт в .catch(). Это особенно полезно в цепочках, где смешиваются sync и async операции.
Метод сразу вызывает функцию синхронно, в отличие от .then(), который всегда асинхронный. Это ускоряет выполнение и упрощает отладку. ECMAScript 2026 стандартизирует это поведение для всех движков.
- Синтаксис простой:
Promise.try(func, arg1, arg2)- func обязательна, аргументы опциональны. - Без аргументов ошибка: TypeError, если забыть функцию.
- Прокидывает промисы: Если func вернёт Promise, то и Promise.try вернёт его.
Сценарий Без Promise.try С Promise.try Успешный sync new Promise(resolve(value)) Promise.try(func) -> fulfilled Sync ошибка try-catch вручную Promise.try(func) -> rejected Async функция Уже промис Прокидывает без изменений Проблемы, которые решает метод
До ECMAScript 2026 разработчики мучились с унификацией кода. Синхронные функции требовали обёртки в Promise, чтобы вписаться в async цепочки. А ошибки приходилось ловить в каждом месте вручную, что раздувало код.
Возьмём пример с запросом к API. Функция getData может быть sync в тестах (читает файл) или async в проде (fetch). Без Promise.try приходится проверять тип возврата: if (result instanceof Promise). С Promise.try - всегда промис, и .then() работает везде.
Ещё одна засада - цепочки обработчиков. Если в начале цепи sync ошибка, она летит мимо .catch(), если не обернуть. Promise.try делает ошибку предсказуемой: всегда rejected промис. Это упрощает middleware в Express или адаптеры в TypeScript.
В TypeScript это идеально для MaybePromise - типа, который может быть T или Promise. Функция toPromise(thunk) использует Promise.try, чтобы всё стало Promise.
- Унификация: Sync и async на равных правах.
- Нюанс: Вызов синхронный, код выполняется сразу.
- Масштабируемость: Подходит для библиотек и фреймворков.
// До async function process() { try { const data = getData(); return await data; } catch (e) { // обработка } } // После async function process() { return Promise.try(getData).then(data => /* ... */); }Примеры использования в практике
Представьте сервис, где часть логики sync (валидация), часть async (БД). Promise.try склеивает их без боли. Синтаксис: Promise.try(() => validate(user)).then(user => fetchUser(user.id)).catch(handleError).
В реальном проекте это спасает от дублирования try-catch. Например, в утилите toResult для Result<T, E>: Promise.try(thunk).then(value => ({ok: true, value})).catch(error => ({ok: false, error})). Sync ошибки ловятся автоматически.
Ещё круто для тестов. Имитируем async операции sync функциями - и всё работает через .then(). Нет нужды в jest fake timers или ручных промисах.
- В API-адаптерах:
Promise.try(() => fs.readFile(path))- файл или ошибка в промисе. - Важно: Аргументы передаются напрямую:
Promise.try(func, arg1). - В цепочках: Заменяет new Promise((resolve) => resolve(func())) - короче и надёжнее.
До ECMAScript 2026 ECMAScript 2026 new Promise с resolve Promise.try(func) Ручной try-catch Автоматический reject Проверка instanceof Promise Всегда промис const getData = () => { throw new Error('Fail'); }; Promise.try(getData) .then(console.log) .catch(err => console.error(err.message)); // "Fail"Promise.try и будущее async
ECMAScript 2026 делает Promise.try стандартом, устраняя полифилы. Это шаг к полной унификации: теперь любой thunk - это промис без boilerplate. Осталось доработать интеграцию с async/await, где try-catch всё равно нужен, но входной слой чище.
Метод не решает все проблемы - для сложных сценариев с несколькими выходами смотрите Promise.withResolvers(). Но для 80% случаев он идеален. Стоит поэкспериментировать в проектах на современных рантаймах.
- Синтаксис простой:
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.