Промисы в 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)); // 1
Promise.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
делает код ещё более читаемым.