비동기 코드를 처리하기 위한 3가지 방법: callback 함수, promise, async await
3. Callback 함수
다른 함수에 인자로 전달되어 나중에 실행되는 함수.
function goMart() {
console.log("마트에 갑니다.");
}
// 콜백함수를 이용해서 pickDrink 작업이 끝난 후 pay가 실행 되도록
function pickDrink(callback) {
// 3초동안 고민하는 함수
setTimeout(function () {
console.log("고민 끝!");
product = "콜라";
price = "1500";
// 9번 ~ 11번 라인 실행 후 callback 호출
callback(); // 매개변수로 받고 있는 콜백함수
}, 3000);
}
function pay() {
console.log(`상품 ${product}에 대한 가격 ${price}지불`);
}
let price, product;
goMart();
pickDrink(pay); // pickDrink 이후에 pay함수가 실행되도록 콜백으로 넘겨 줌
// pay();
/**
마트에 갑니다.
고민 끝!
상품 콜라에 대한 가격 1500지불
*/
4. Promise
비동기 작업의 최종 완료 또는 실패를 나타내는 객체.
비동기 작업이 완료된 이후에 다음 작업을 연결시켜 진행할 수 있는 기능을 가짐.
promise의 상태
pending (대기): promise를 수행 중인 상태
fulfilled (이행): promise가 resolve가 된 상태 (성공)
rejected (거부): promise가 지켜지지 못한 상태. (실패)
settled: fulfilled 혹은 rejected로 결론이 난 상태
🍔 햄버거 주문에 비유:
주문 (Promise 생성)
대기 중 (Pending 상태)
햄버거 완성 (Fulfilled 상태) 또는 재료 소진 (Rejected 상태)
function goMart() {
console.log("마트에 갑니다.");
}
function pickDrink() {
return new Promise(function (resolve, reject) {
// 3초동안 고민하는 함수
setTimeout(function () {
console.log("고민 끝!");
product = "콜라";
price = "1500";
// resolve("구매 완료"); // then의 콜백의 인자로 전달
reject("구매 실패");
}, 3000);
});
}
function pay() {
console.log(`상품 ${product}에 대한 가격 ${price}원 지불`);
}
// 실행함수
function exec() {
goMart();
pickDrink()
.then((result) => {
// pickDrink가 끝나고 나서 실행되는 작업
pay();
console.log("result?", result);
// result는 resolve로 전달된 값
})
.catch((err) => {
console.log("err?", err);
// reject로 전달된 값
})
.finally(() => {
console.log("집으로 돌아갑니다."); // finally: promise의 성공 여부와 상관없이 무조건적으로 실행
});
}
let price, product;
exec();
5. async / await
promise를 더 쉽게 사용할 수 있게 해주는 문법.
promise 기반 코드를 좀 더 읽고 쓰기 쉽게 하기 위해 등장
async는 함수 앞에 붙어 promise를 반환한다.
function callPromise(name) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
//console.log(name);
resolve(name); // cb 대신 resolve로 값 넘기기
}, 1000);
});
}
function backPromise() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
//console.log("back");
resolve("back");
}, 1000);
});
}
function hellPromise() {
// reject생략 가능
return new Promise((resolve) => {
setTimeout(function () {
resolve("callback hell");
}, 1000);
});
}
async function execute() {
const name = await callPromise("harry");
console.log(name + "반가워");
const back = await backPromise();
console.log(back + "을 실행했구나");
const hell = await hellPromise();
console.log("여기는 " + hell);
}
execute();