Готовый перевод Modern JS Cheatsheet / Памятка по современному JavaScript: Промисы
### Промисы
Промис (promise) — это объект, который может быть синхронно возвращён из асинхронной функции ([ccskrf](https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261#3cd0)).
Промисы могут использоваться, чтобы избежать [глубоко вложенных колбэков](http://callbackhell.com/), и они всё чаще и чаще встречаются в современных JavaScript проектах.
#### Пример кода
```js
const fetchingPosts = new Promise((res, rej) => {
$.get("/posts")
.done(posts => res(posts))
.fail(err => rej(err));
});
fetchingPosts
.then(posts => console.log(posts))
.catch(err => console.log(err));
```
#### Пояснение
Когда вы делаете *AJAX-запрос*, ответ будет несинхронным, т.к. вы запрашиваете ресурс, на обработку которого требуется некоторое время. Вы также можете вообще не получить ответ, если он недоступен по какой-то причине (404).
Чтобы избежать таких ситуаций, в ES2015 были добавлены *промисы*. Промисы могут иметь 3 различных состояния:
- Выполняется
- Выполнено
- Отклонено
Предположим, мы хотим использовать промисы для обработки AJAX-запроса для извлечения ресурса X.
##### Создание промиса
Сначала нам нужно создать промис. Мы будем использовать GET-метод jQuery для создания AJAX-запроса к X.
```js
const xFetcherPromise = new Promise( // Создаём промис с помощью ключевого слова "new" и сохраняем его в переменную
function(resolve, reject) { // Конструктор Promise принимает в виде параметра функцию, которая, в свою очередь, принимает 2 параметра: resolve и reject
$.get("X") // Запускаем AJAX-запрос
.done(function(X) { // Как только запрос выполнен...
resolve(X); // ... выполняем промис с X в качестве значения
})
.fail(function(error) { // Если запрос не прошёл...
reject(error); // ... отклоняем промис со значением error
});
}
)
```
Как видно из рассмотренного примера, объект Promise принимает функцию, которая принимает два параметра: **resolve** и **reject**. Эти параметры - функции, которые при вызове изменяют состояние промиса со значения *выполняется* на *выполнено* или *отклонено*.
Промис находится в состоянии выполнения после создания экземпляра, и его функция-*исполнитель* выполняется немедленно. Как только одна из функций *выполнения* или *отклонения* вызвана в функции-*исполнителе*, промис вызовет связанные с ним обработчики.
##### Использование обработчиков промисов
Чтобы получить результат (или ошибку) промиса, мы должны присоединить к нему обработчики следующим образом:
```js
xFetcherPromise
.then(function(X) {
console.log(X);
})
.catch(function(err) {
console.log(err)
})
```
Если вызов прошёл успешно, вызывается *resolve*, и выполняется функция, переданная в метод ```.then```.
Если вызов не прошёл, вызывается *reject*и выполняется функция, переданная в ```.catch```.
> **Примечание :** Если обработчик присоединяется, когда когда промис уже был выполнен или отклонён, обработчик всё равно будет вызван. Так что нет никакой гонки между выполнением асинхронной операции и вызовом ее обработчиков. [(Ссылка: MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Description)
#### Дополнительные материалы
- [Промисы в JavaScript для чайников - Jecelyn Yeen](https://scotch.io/tutorials/javascript-promises-for-dummies)
- [API для промиса в JavaScript - David Walsh](https://davidwalsh.name/promises)
- [Использование промисов - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)
- [Что такое промис - Eric Elliott](https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261)
- [Промисы в JavaScript: Введение - Jake Archibald](https://developers.google.com/web/fundamentals/getting-started/primers/promises)
- [Документация по промисам - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/70916/381884
Переводчики: wizjer, a_popova
Настройки
Готово:
