diff --git a/js/promise-try/practice/zheleznikov.md b/js/promise-try/practice/zheleznikov.md new file mode 100644 index 0000000000..0075a0d8d2 --- /dev/null +++ b/js/promise-try/practice/zheleznikov.md @@ -0,0 +1,47 @@ +🛠 `Promise.try()` может пригодиться в UI-китах и библиотеках, которые принимают колбэк и не знают заранее, вернёт ли он значение, промис или выбросит ошибку. + +Предположим, что компонент формы принимает обработчик `onSubmit`. Пользователь библиотеки может передать в него функцию, которая: + +- возвращает синхронный результат; +- возвращает промис; +- выбрасывает ошибку ещё до начала асинхронной операции. + +Задача компонента - одинаково обработать успешный результат и ошибку в любом из этих случаев. Для этого можно обернуть вызов `onSubmit` в `Promise.try()`: + +```js +function handleSubmit(onSubmit) { + Promise.try(onSubmit) + .then((result) => { + console.log('Успех:', result) + }) + .catch((error) => { + console.error('Ошибка:', error.message) + }) +} +``` + +Теперь `handleSubmit()` сможет единообразно обработать любой вариант `onSubmit`: + +```js +// Синхронный обработчик +handleSubmit(() => { + return 'Форма отправлена' +}) +// Успех: Форма отправлена + +// Асинхронный обработчик +handleSubmit(() => { + return Promise.resolve('Данные отправлены на сервер') +}) +// Успех: Данные отправлены на сервер + +// Обработчик с ошибкой +handleSubmit(() => { + throw new Error('Поле email обязательно') +}) +// Ошибка: Поле email обязательно +``` + +Во всех случаях результат попадёт в `then()`, а ошибка — в `catch()`. + +`Promise.try()` возвращает промис, поэтому результат `onSubmit` можно обрабатывать одинаково, независимо от того, синхронная это функция или асинхронная.