Этот вопрос исследует эволюцию асинхронного программирования в JavaScript и жизненный цикл Promise.
Промисы пришли на смену callback hell и предоставили более чистый способ работы с асинхронными операциями. Промис имеет три состояния: pending (ожидание), fulfilled (выполнено успешно) и rejected (выполнено с ошибкой). После перехода в fulfilled или rejected состояние промиса больше не меняется.
Промисы решают проблемы асинхронного кода, которые были характерны для callback-based подхода.
Эволюция асинхронности:
Callback Hell:
// Проблема вложенных callback'ов
getData(function(data1) {
processData(data1, function(data2) {
saveData(data2, function(data3) {
displayData(data3, function() {
// И так далее...
});
});
});
});Promise решение:
getData()
.then(processData)
.then(saveData)
.then(displayData)
.catch(handleError);Состояния Promise:
1. Pending (Ожидание):
const promise = new Promise((resolve, reject) => {
// Асинхронная операция еще не завершена
});
// promise.state = 'pending'2. Fulfilled (Выполнено):
const promise = Promise.resolve('success');
// или
const promise = new Promise((resolve) => {
resolve('success');
});
// promise.state = 'fulfilled'3. Rejected (Отклонено):
const promise = Promise.reject(new Error('failure'));
// или
const promise = new Promise((resolve, reject) => {
reject(new Error('failure'));
});
// promise.state = 'rejected'Схема переходов:
Pending
↓
Fulfilled (с значением)
или
Rejected (с причиной ошибки)Определение состояния:
const promise = someAsyncOperation();
promise.then(
value => {
console.log('Fulfilled:', value);
},
error => {
console.log('Rejected:', error);
}
);Особенности:
Состояние изменяется только один раз
Нельзя отменить выполнение Promise
Цепочка then/catch создает новые Promise
Преимущества над callback'ами:
Читаемый последовательный код
Централизованная обработка ошибок
Возможность комбинирования через Promise.all/race