JavaScript — однопоточный язык программирования, то есть одновременно может происходить только одно действие. До появления ES6 мы использовали обратные вызовы для обработки асинхронных задач, таких как сетевые запросы.
Используя обещания, мы можем избежать пресловутого «ада обратных вызовов» и сделать наш код чище, проще для чтения и понимания.
Предположим, мы хотим получить некоторые данные с сервера асинхронно, используя обратные вызовы, мы сделаем примерно следующее:
getData(function(x){
console.log(x);
getMoreData(x, function(y){
console.log(y);
getSomeMoreData(y, function(z){
console.log(z);
});
});
});
Здесь я запрашиваю некоторые данные с сервера, вызывая функцию getData(), которая получает данные внутри функции обратного вызова. Внутри функции обратного вызова я запрашиваю еще некоторые данные, вызывая функцию getMoreData(), передавая в качестве аргумента ранее полученные данные, и так далее.
Это то, что мы называем адом обратных вызовов, где каждый обратный вызов вложен в другой обратный вызов, и каждый внутренний обратный вызов зависит от своего родителя.
Мы можем переписать приведенный выше фрагмент, используя обещания. Например:
getData()
.then((x) => {
console.log(x);
return getMoreData(x);
})
.then((y) => {
console.log(y);
return getSomeMoreData(y);
})
.then((z) => {
console.log(z);
});
Что такое обещание?
Обещание — это объект, который хранит будущее значение асинхронной операции. Например, если мы запрашиваем некоторые данные с сервера, обещание обещает нам получить эти данные, которые мы сможем использовать в будущем.
Состояния обещания
Обещание в JavaScript, как и обещание в реальном мире, имеет 3 состояния. Оно может быть выполнено, разрешено, отклонено. Например:
-
Неразрешенное или Ожидающее :-.
Обещание находится в состоянии ожидания, если результат не готов. То есть, он ждет, пока что-то завершится (например, асинхронная операция).
-
Решено или выполнено :-
Обещание выполнено, если результат доступен. То есть, что-то завершилось (например, операция async) и все прошло хорошо.
-
Отклонено :-
Обещание отклоняется, если произошла ошибка.