Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions js/promise-try/practice/zheleznikov.md
Original file line number Diff line number Diff line change
@@ -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)
})
}
```
Comment on lines +11 to +21
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай прокинем в аргументы formData? Реальный обработчик формы почти всегда принимает данные формы. Было бы полезно показать вариант с передачей данных. Это и полнее раскрывает API, и ближе к реальному использованию

Ну и return я бы дописал


Теперь `handleSubmit()` сможет единообразно обработать любой вариант `onSubmit`:

```js
// Синхронный обработчик
handleSubmit(() => {
return 'Форма отправлена'
})
// Успех: Форма отправлена

// Асинхронный обработчик
handleSubmit(() => {
return Promise.resolve('Данные отправлены на сервер')
})
// Успех: Данные отправлены на сервер

// Обработчик с ошибкой
handleSubmit(() => {
throw new Error('Поле email обязательно')
})
// Ошибка: Поле email обязательно
```

Во всех случаях результат попадёт в `then()`, а ошибка — в `catch()`.

`Promise.try()` возвращает промис, поэтому результат `onSubmit` можно обрабатывать одинаково, независимо от того, синхронная это функция или асинхронная.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По-моему эта мысль уже сказана в предыдущем предложении

Loading