Зачем нужны промисы?

Чтобы понять зачем нужны промисы, нужно попасть в ситуацию, когда без них было бы плохо.

Если брать пример из жизни, то, например, вы решили приготовить пирог, поставили его в духовку, но вместо того, чтобы спокойно идти смотреть фильм, вы вынуждены сидеть у плиты без дела в ожидании готовности.
А можно было бы столько всего успеть сделать! Такая вот однопоточность царит в JavaScript.

Однако, в жизни все иначе — мы можем спокойно заниматься другими делами, пока пирог печется. О его готовности мы узнаем по сигналу и тогда уж вернемся к плите получить результат, поесть.
Причем, если мы заложили не все необходимые ингредиенты, плита нам сообщит об ошибке.

И в разработке может понадобиться выполнить какую-либо операцию только после получения результата из предыдущей, либо даже нескольких.
Причем мы не знаем когда будет результат той или иной операции.
И мы, конечно, же не собираемся простаивать, не выполняя остальной код.

Callback пример

Простейший пример callback это функция setTimeout:

var callback = function () {
    console.log("Прошло 10 секунд");
};
setTimeout(callback, 10000);

Т.е. только через 10 секунд в консоль будет выведена фраза «Прошло 10 секунд», хотя код навешивания callback выполнится раньше, и мы вообще еще кучу всего успели сделать.

Callback на пользовательское событие

В некоторых случаях мы не можем вообще предугадать, когда произойдет то или иное событие. Например, когда пользователь кликнет по кнопке, поэтому мы навешиваем на событие click элемента #btn callback функцию alert:

$( "#btn" ).on( "click", alert);

function alert () {
    alert("btn was submitted");
}

Callback hell

А теперь давайте что-нибудь посложнее! Надо же выяснить зачем ввели промисы, если замечательно работают колбаки.
Допустим мы хотим сначала подгрузить данные профиля юзера, затем рекомендованные ему посты.
Значит нам нужно как-то узнать о том, что данные юзера уже загружены. Нам нужен callback! А если по-русски, то нам нужно чтоб нам сообщили, как будет результат.

Это могло бы выглядеть так:

Мы получили (или нет) данные юзера, затем по известному теперь id, получаем рекомендации (или сообщение об ошибке).

Как видите уже довольно громоздко, а если мы затем решим получить еще и комментарии к каждой статье, то
написали бы так называемый «callback hell». Сложночитаемый вложенный код.

Так зачем промисы?

С промисами все выглядит намного проще:

Промис — это объект, который может находится в состояниях:

pending — изначальное состояние — ожидание, операция не выполнена и не отклонена.
fulfilled — операция успешно выполнена, в таком случае возвращается результат.
rejected — операция не выполнилась, возвращается причина — ошибка.

В примере выше, когда промис переходит в состояние fulfilled, вызывается обработчик метода then(), в котором мы уже работаем с возвращенным результатом.
Если же промис переходит в состояние rejected, то вызывается обработчик метода fail().
Как видите благодаря такой цепочке нам достаточно прописать его один раз.

Это лишь один пример использования промисов. Тема признаться не простая, так что про промисы в angularJS я расскажу в следующем посте 🙂

Почитать про промисы

У нас проблема с промисами

Промисы в Jquery

Хотите быть в курсе новых статей?