JavaScript Promise는 비동기 연산의 최종 완료 또는 실패를 나타내는 객체다. 콜백 지옥을 해결하고, async/await의 기반이 된다.
Promise 기본
javascript
const p = new Promise((resolve, reject) => {
setTimeout(() => resolve('성공'), 1000);
// 실패 시: reject(new Error('실패'))
});
p.then(v => console.log(v)) // '성공'
.catch(e => console.error(e))
.finally(() => console.log('완료'));
Promise 조합 메서드
javascript
const p1 = fetch('/api/users');
const p2 = fetch('/api/posts');
const p3 = fetch('/api/comments');
// all: 모두 성공 시 배열 반환, 하나라도 실패 시 즉시 reject
const [users, posts] = await Promise.all([p1, p2]);
// allSettled: 모두 완료 후 각 결과 반환 (실패 무시)
const results = await Promise.allSettled([p1, p2, p3]);
results.forEach(r => {
if (r.status === 'fulfilled') console.log(r.value);
else console.error(r.reason);
});
// race: 가장 먼저 완료된 것만 반환
const first = await Promise.race([p1, p2]);
// any: 첫 번째 성공 반환, 모두 실패 시 AggregateError
const fastest = await Promise.any([p1, p2, p3]);
async/await와 에러 처리
javascript
async function fetchUser(id) {
try {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return await response.json();
} catch (err) {
console.error('사용자 로드 실패:', err);
throw err; // 재던지기
}
}
// 병렬 실행 (순차 X)
async function loadDashboard() {
const [user, posts] = await Promise.all([
fetchUser(1),
fetchPosts(1)
]);
return { user, posts };
}
Promise 내부: 마이크로태스크 큐
javascript
console.log('1');
Promise.resolve().then(() => console.log('2')); // 마이크로태스크
setTimeout(() => console.log('3'), 0); // 태스크 큐
console.log('4');
// 출력 순서: 1, 4, 2, 3
// 마이크로태스크가 태스크보다 먼저 실행됨
관련 개념