Промисы – это функция, которая появилась впервые в спецификации JavaScript ES6 (ES2015). Промисы существенно упрощают работу с асинхронным кодом без преобразования в несколько уровней функций обратного вызова. Именно благодаря промисам мы можем навсегда попрощаться с адом обратного вызова.
Базовый промис объявляется вот так.
let myPromise = new Promise((resolve, reject) => {
let data;
setTimeout(() => {
data = "Some payload";
if (data) {
resolve(data);
} else {
reject();
}
Обычно после него вызывается что-то асинхронное, например, внешний API. Здесь мы моделируем подобную ситуацию с помощью функции setTimeout.
Обратите внимание, новый промис инициируется с двумя функциями в качестве аргументов: одна функция предназначена для успешного выполнения промиса, а вторая – для ошибки. А вот как можно вызвать промис, чтобы получить из него данные о полезной нагрузке:
myPromise.then(data => {
console.log('Received: ' + data);
}).catch(() => {
console.log("There was an error");
});
Приведенное выше код выведет в консоль следующее:
Received: Some payload
Если данные не были получены, в консоли будет следующее:
There was an error
Цепочки промисов
Промисы также можно объединять в цепочку с помощью функций then. Значение, возвращаемое предыдущей функцией then, становится значением, доступным следующей функции, и так по цепочке:
myPromise.then(data => {
console.log('Received: ' + data);
let moreData = "Another payload";
return moreData;
}).then(data => {
console.log(data);
}).catch(() => {
console.log("There was an error");
});
В консоли будет такой вывод:
Received: Some payload
Another payload