Промисы в JavaScript используются для работы с асинхронным кодом. Они позволяют избежать вложенности колбэков и упрощают обработку ошибок.
Что такое промис?
Промис (Promise) представляет собой объект, который находится в одном из трёх состояний:
pending– ожидание результата;fulfilled– успешно выполнен;rejected– отклонён с ошибкой.
Создаётся через конструктор Promise, принимающий функцию с двумя параметрами: resolve (для успешного выполнения) и reject (для ошибки).
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Данные загружены");
}, 2000);
});Методы обработки промисов
then()
Метод then() вызывается при успешном выполнении промиса.
promise.then(result => {
console.log(result); // "Данные загружены"
});catch()
Метод catch() используется для обработки ошибок.
const failedPromise = new Promise((resolve, reject) => {
setTimeout(() => {
reject("Ошибка загрузки");
}, 2000);
});
failedPromise
.then(result => console.log(result))
.catch(error => console.log(error)); // "Ошибка загрузки"finally()
Метод finally() выполняется в любом случае — независимо от того, был промис выполнен или отклонён.
failedPromise
.then(result => console.log(result))
.catch(error => console.log(error))
.finally(() => console.log("Завершение операции"));Цепочка промисов
Промисы позволяют строить цепочки операций.
new Promise(resolve => {
setTimeout(() => resolve(1), 1000);
})
.then(result => {
console.log(result); // 1
return result * 2;
})
.then(result => {
console.log(result); // 2
return result * 3;
})
.then(result => {
console.log(result); // 6
});Методы Promise API
Promise.all()
Метод Promise.all() выполняет несколько промисов параллельно и возвращает массив результатов. Если хотя бы один промис завершается с ошибкой, весь Promise.all() отклоняется.
const promise1 = new Promise(resolve => setTimeout(() => resolve(1), 1000));
const promise2 = new Promise(resolve => setTimeout(() => resolve(2), 2000));
const promise3 = new Promise(resolve => setTimeout(() => resolve(3), 3000));
Promise.all([promise1, promise2, promise3])
.then(results => console.log(results)) // [1, 2, 3]
.catch(error => console.log(error));Promise.race()
Метод Promise.race() возвращает первый завершившийся промис.
Promise.race([promise1, promise2, promise3])
.then(result => console.log(result)); // 1Promise.allSettled()
Метод Promise.allSettled() ожидает выполнения всех промисов, но не отклоняется при ошибке.
const failed = new Promise((_, reject) => setTimeout(() => reject("Ошибка"), 1500));
Promise.allSettled([promise1, failed])
.then(results => console.log(results));async/await: упрощённая работа с промисами
Ключевые слова async и await позволяют писать асинхронный код в синхронном стиле.
async function fetchData() {
try {
let result = await promise;
console.log(result);
} catch (error) {
console.log(error);
}
}
fetchData();Промисы упрощают работу с асинхронными операциями и позволяют строить цепочки выполнения. Методы then(), catch(), finally() помогают управлять результатами, а Promise.all() и Promise.race() дают возможность работать с несколькими промисами одновременно. async/await делает код ещё более читаемым.