Promise (Обещание) — это специальный объект в JavaScript, представляющий результат асинхронной операции, который может быть доступен сейчас или в будущем.
pending
(ожидание) — начальное состояние.fulfilled
(выполнено) — операция завершена успешно.rejected
(отклонено) — операция завершена с ошибкой.const promise = new Promise((resolve, reject) => {
// Асинхронная операция (например, HTTP-запрос)
if (success) {
resolve('Успех!'); // Переводим в fulfilled
} else {
reject('Ошибка!'); // Переводим в rejected
}
});
// Проблема без Promise (Callback Hell)
getUser(userId, function(user) {
getPosts(user, function(posts) {
getComments(posts[0], function(comments) {
console.log(comments);
});
});
});
// Решение с Promise
getUser(userId)
.then(user => getPosts(user))
.then(posts => getComments(posts[0]))
.then(comments => console.log(comments))
.catch(error => console.error(error));
.then()
— обрабатывает успешное выполнение..catch()
— обрабатывает ошибки..finally()
— выполняется в любом случае.Promise.all()
— ожидает выполнение всех Promise.Promise.race()
— возвращает первый завершенный Promise.// Цепочка вызовов
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
// Параллельное выполнение
Promise.all([fetch(url1), fetch(url2)])
.then(responses => Promise.all(responses.map(res => res.json())))
.then(data => console.log(data));
В Angular Promise часто используются вместе с Observable (из RxJS), но для простых асинхронных задач они идеальны:
@Injectable()
export class DataService {
fetchData(): Promise<any> {
return fetch('/api/data').then(response => response.json());
}
}
// Использование в компоненте
this.dataService.fetchData()
.then(data => this.data = data)
.catch(error => this.error = error);
ES2017 представил async/await
для работы с Promise в стиле синхронного кода:
async function loadData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
pending
→ fulfilled
или rejected
..then()
— для успешного результата..catch()
— для ошибок..finally()
— для финальных действий.async/await
.P.S. В современных Angular-проектах часто используют Observable (RxJS), но Promise остаются важной частью JS-экосистемы. Для работы с API fetch
или async/await
они незаменимы.