[SeSACx코딩온] 비동기 처리: Promise
비동기 처리: Promise
Promise
1. 개념
Promise는 비동기 작업의 성공 또는 실패를 처리하는 객체입니다. then 메서드로 작업이 성공했을 때의 결과를 처리하고, catch 메서드로 실패했을 때의 에러를 처리합니다. Promise는 작업이 성공(resolve)하거나 실패(reject)하는 경우를
설정하여 처리합니다.
2. 실행 순서
- Promise 객체가 생성됩니다.
- 비동기 작업이 실행됩니다.
- 작업이 성공하면
resolve가 호출되고, 실패하면reject가 호출됩니다. then또는catch메서드로 결과를 처리합니다.
3. 예제 코드
function goMart() {
console.log('마트에 가서 어떤 음료를 살지 고민한다..');
}
function pickDrink() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('고민 끝');
const product = '제로콜라';
const price = 3000;
if (product) {
resolve({ product, price });
}
// reject 예시, 현재 코드에서는 product가 항상 있으므로 굳이 필요없음.
// else {
// reject(new Error('제품을 찾을 수 없습니다.'));
// }
}, 3000);
});
}
function pay({ product, price }) {
console.log(`상품명: ${product} // 가격: ${price}`);
}
goMart();
pickDrink()
.then(pay)
.catch(function(err) {
console.error(err);
});
4. 분석
- (1)
goMart함수가 호출되어 “마트에 가서 어떤 음료를 살지 고민한다..”라는 메시지가 출력됩니다. - (2)
pickDrink함수가 호출됩니다. 이 함수는 새로운 Promise를 반환합니다. 이 함수는setTimeout을 통해 3초 후에 비동기 작업을 시작합니다. - (3) 3초 후
setTimeout의 콜백 함수가 실행됩니다. “고민 끝”이라는 메시지가 출력되고,product변수에 ‘제로콜라’,price변수에 3000을 할당합니다. - (4)
pickDrink함수의 내부에서resolve가 호출되어 Promise가 성공 상태가 됩니다. - (5)
then메서드에 전달된pay함수가 호출되며,product와price를 인자로 받아 “상품명: 제로콜라 // 가격: 3000”이라는 메시지가 출력됩니다. - (6) Promise가 실패하지 않았으므로
catch블록은 실행되지 않습니다.
5. 장단점
- 장점: 가독성이 좋고 체인 형식으로 비동기 작업을 처리할 수 있습니다. 비동기 작업을 단계적으로 연결할 수 있어 복잡한 작업을 쉽게 처리할 수 있습니다.
- 단점: 여전히 콜백 지옥을 완전히 피하지 못할 수 있으며, 많은
then과catch를 사용하면 코드가 길어질 수 있습니다.