Modern JS Cheatsheet / Памятка по современному JavaScript: Промисы
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
### Промисы wizjer 11.10.17 в 07:48 |
+2 |
|
Промис (promise) - это объект, который может быть синхронно возвращён из асинхронной функции ([ccskrf](https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261#3cd0)). a_popova 04.10.17 в 15:21 Промис (promise) — это объект, который может быть синхронно возвращён из асинхронной функции ([ccskrf](https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261#3cd0)). wizjer 11.10.17 в 07:52 |
||
|
Промисы могут использоваться, чтобы избежать [callback hell](http://callbackhell.com/),и они всё чаще и чаще встречаются в современных JavaScript проектах. a_popova 04.10.17 в 15:21 Промисы могут использоваться, чтобы избежать [глубоко вложенных колбэков](http://callbackhell.com/), и они всё чаще и чаще встречаются в современных JavaScript проектах. wizjer 11.10.17 в 07:52 |
+3 | |
|
#### Пример кода a_popova 04.10.17 в 15:22 |
||
|
```js a_popova 04.10.17 в 15:22 |
||
|
#### Пояснение a_popova 04.10.17 в 15:22 |
||
|
Когда вы делаете *Ajax-запрос*, ответ не является синхронным, т.к. вы запрашиваете ресурс, на обработку которого требуется некоторое время. Вы также можете вообще не получить ответ, если он недоступен по какой-то причине (404). a_popova 04.10.17 в 15:23 Когда вы делаете *AJAX-запрос*, ответ будет несинхронным, т.к. вы запрашиваете ресурс, на обработку которого требуется некоторое время. Вы также можете вообще не получить ответ, если он недоступен по какой-то причине (404). wizjer 11.10.17 в 08:01 |
||
|
Чтобы избежать таких ситуаций, в ES2015 были добавлены *промисы*. Промисы могут иметь 3 различных состояния: a_popova 04.10.17 в 15:23 Чтобы избежать таких ситуаций, в ES2015 были добавлены *промисы*. Промисы могут иметь 3 различных состояния: wizjer 11.10.17 в 07:57 |
||
|
- Выполняется a_popova 04.10.17 в 15:24 |
||
|
Предположим, мы хотим использовать промисы для обработки Ajax-запроса для извлечения ресурса X. a_popova 04.10.17 в 15:24 Предположим, мы хотим использовать промисы для обработки AJAX-запроса для извлечения ресурса X. wizjer 11.10.17 в 07:58 |
||
|
##### Создание промиса a_popova 04.10.17 в 15:25 ##### Создание промиса wizjer 11.10.17 в 07:58 |
||
|
Сначала нам нужно создать промис. Мы будем использовать get-метод jQuery для создания Ajax-запроса к X. a_popova 04.10.17 в 15:25 Сначала нам нужно создать промис. Мы будем использовать GET-метод jQuery для создания AJAX-запроса к X. wizjer 11.10.17 в 08:00 |
||
|
```js a_popova 04.10.17 в 15:26 ```js wizjer 11.10.17 в 08:03 |
||
|
Как видно из предыдущего примера, объект Promise принимает функцию, которая принимает два параметра: **resolve** и **reject**. Эти параметры - функции, которые при вызове изменяют состояние промиса со значения *выполняется* на *выполнено* или *отклонено*. a_popova 04.10.17 в 15:28 Как видно из рассмотренного примера, объект Promise принимает функцию, которая принимает два параметра: **resolve** и **reject**. Эти параметры - функции, которые при вызове изменяют состояние промиса со значения *выполняется* на *выполнено* или *отклонено*. wizjer 11.10.17 в 08:04 |
+2 | |
|
Промис находится в состоянии выполнения после создания экземпляра, и его функция-*исполнитель* выполняется немедленно. Как только одна из функций *выполнения* или *отклонения* вызвана в функции-*исполнителе*, промис вызовет связанные с ним обработчики. a_popova 04.10.17 в 15:31 Промис находится в состоянии выполнения после создания экземпляра, и его функция-*исполнитель* выполняется немедленно. Как только одна из функций *выполнения* или *отклонения* вызвана в функции-*исполнителе*, промис вызовет связанные с ним обработчики. wizjer 11.10.17 в 08:04 |
||
|
##### Использование обработчиков промисов a_popova 04.10.17 в 15:31 ##### Использование обработчиков промисов wizjer 11.10.17 в 08:05 |
||
|
Чтобы получить результат (или ошибку) промиса, мы должны присоединиться к его обработчикам следующим образом: a_popova 04.10.17 в 15:32 Чтобы получить результат (или ошибку) промиса, мы должны присоединить к нему обработчики следующим образом: wizjer 11.10.17 в 08:05 |
||
|
```js a_popova 04.10.17 в 15:32 |
||
|
Если вызов прошёл успешно, вызывается *resolve*, и выполняется функция, переданная в метод ```.then```. a_popova 04.10.17 в 15:33 |
||
|
Если вызов не прошёл, вызывается *reject*и выполняется функция, переданная в ```.catch```. a_popova 04.10.17 в 15:34 |
||
|
> **Примечание :** Если промис уже был выполнен или отклонен, когда вызывается соответствующий обработчик, обработчик всё равно будет вызван, так что нет никакой гонки между выполнением асинхронной операции и вызовом ее обработчиков. [(Ссылка: MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Description) a_popova 04.10.17 в 15:35 > **Примечание :** Если обработчик присоединяется, когда когда промис уже был выполнен или отклонён, обработчик всё равно будет вызван. Так что нет никакой гонки между выполнением асинхронной операции и вызовом ее обработчиков. [(Ссылка: MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Description) wizjer 11.10.17 в 08:08 |
||
|
#### Дополнительные материалы a_popova 04.10.17 в 15:35 |
||
|
- [Промисы в JavaScript для чайников - Jecelyn Yeen](https://scotch.io/tutorials/javascript-promises-for-dummies) a_popova 04.10.17 в 15:37 |
