Кратко
СкопированоМетод try
— это один из статических методов объекта Promise. Метод Promise
оборачивает результат выполнения колбэк-функции в промис.
Пример
СкопированоСоздадим функцию handle
, которая обработает результаты выполнения других функций: и синхронных, и асинхронных.
function handleFn(func){ return Promise.try(func) .then((result) => console.log('результат:', result)) .catch((error) => console.error('ошибка:', error))}// Аргумент: асинхронная функцияhandleFn(() => Promise.resolve(42))// результат: 42// Аргумент: синхронная функцияhandleFn(() => 42)// результат: 42// Аргумент: функция, бросающая синхронную ошибкуhandleFn(() => { throw new Error('error')})// ошибка: Error: error
function handleFn(func){ return Promise.try(func) .then((result) => console.log('результат:', result)) .catch((error) => console.error('ошибка:', error)) } // Аргумент: асинхронная функция handleFn(() => Promise.resolve(42)) // результат: 42 // Аргумент: синхронная функция handleFn(() => 42) // результат: 42 // Аргумент: функция, бросающая синхронную ошибку handleFn(() => { throw new Error('error') }) // ошибка: Error: error
Как пишется
СкопированоPromise.try(func, arg1, arg2, ..., argN)
Promise.try(func, arg1, arg2, ..., argN)
Promise
принимает один обязательный аргумент — функцию для вызова. Она может быть как синхронной, так и асинхронной. Остальные аргументы необязательные, это параметры для передачи в функцию.
Если вызвать Promise
без аргументов, будет ошибка TypeError.
Promise
возвращает новый промис, который будет:
- в состоянии «выполненно» (fulfilled), если переданная синхронная функция возвращает значение;
- в состоянии «ошибка» (rejected), если переданная синхронная функция бросает ошибку;
- в состоянии «ожидание» (pending), если переданная функция возвращает промис.
Как понять
СкопированоPromise
помогает достичь единообразия обработки результата как синхронной, так и асинхронной колбэк-функции.
Промисы позволяют удобно обрабатывать результат выполнения асинхронного кода. В случае «успеха» мы используем Promise
, а в случае ошибки — Promise
.
Предположим, у нас есть функция запроса к серверу get
:
getData(requestData) .then((result) => console.log('результат:', result)) .catch((error) => console.error('ошибка', error))
getData(requestData) .then((result) => console.log('результат:', result)) .catch((error) => console.error('ошибка', error))
Если при выполнении запроса (асинхронной операции) произойдёт ошибка, она будет корректно обработана c помощью catch
, потому что функция вернёт промис в состоянии «ошибка».
Но что произойдёт, если при выполнении get
возникнет синхронная ошибка, например, при формировании данных для запроса? Функция не вернёт промис, а ошибка останется необработанной.
Рассмотрим на примере:
function getData(requestData) { // В функции отсутствует проверка типа аргумента const url = requestData.url // ❌ return fetch(url)}// Вызов функции без параметра приведёт к ошибке TypeErrorgetData().then((result) => { // ...}).catch((error) => { // Ошибка не будет обработана})
function getData(requestData) { // В функции отсутствует проверка типа аргумента const url = requestData.url // ❌ return fetch(url) } // Вызов функции без параметра приведёт к ошибке TypeError getData() .then((result) => { // ... }) .catch((error) => { // Ошибка не будет обработана })
Чтобы единообразно обрабатывать ошибки в блоке catch
нужно, чтобы функция get
всегда возвращала промис, даже если внутри синхронный код. В этом нам поможет Promise
:
// Вызов функции без параметра приведёт к ошибке, но она будет обработана,// так как `Promise.try()` возвращает промисPromise.try(getData).then((result) => { // ...}).catch((error) => { // Обработка ошибки})
// Вызов функции без параметра приведёт к ошибке, но она будет обработана, // так как `Promise.try()` возвращает промис Promise.try(getData) .then((result) => { // ... }) .catch((error) => { // Обработка ошибки })
Альтернативы
СкопированоРассмотрим варианты замены Promise
:
Promise
— работает почти также, но функция. resolve ( ) . then ( func ) func
всегда начинает выполняться асинхронно.
Обратите внимание на порядок сообщений консоли:
const func = () => console.log('1')Promise.resolve().then(func)console.log('2')// 2// 1
const func = () => console.log('1') Promise.resolve().then(func) console.log('2') // 2 // 1
Promise
позволяет выполнять синхронную функцию сразу. Это может иметь значение, когда требуется гарантированное выполнение функции без всякой задержки.
const func = () => console.log('1')Promise.try(func)console.log('2')// 1// 2
const func = () => console.log('1') Promise.try(func) console.log('2') // 1 // 2
new
— работает, какPromise ( resolve = > resolve ( func ( ) ) ) Promise
, но обладает более сложным синтаксисом и труднее запоминается.. try ( )
Преимущества
Скопировано- Нет необходимости разделять логику обработки результатов выполнения синхронных и асинхронных колбэк-функций;
- «Промисификация» результата выполнения колбэк-функции может быть достигнута без изменения реализации колбэк-функций;
- Обработка ошибок колбэк-функции может единообразно выполняться в блоке
catch
.
- Chrome 128, поддерживается
- Edge 128, поддерживается
- Firefox 134, поддерживается
- Safari 18.2, поддерживается