Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Promise.try в ECMAScript 2026: упрощение асинхронного кода без try-catch

Promise.try в ECMAScript 2026: упрощение асинхронного кода без try-catch

Запланировано Прикреплена Закрыта Перенесена JavaScript
promise.tryecmascript 2026асинхронный код
1 Сообщения 1 Постеры 55 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал в отредактировано
    #1

    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-болей.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы