function first() {
console.log('첫번째 함수');
second();
}
function second() {
console.log('두번째 함수');
}
first();
// 실행 순서
// 첫번째 함수
// 두번째 함수
console.log('시작');
setTimeout(() => {
console.log('타이머 완료');
}, 0);
console.log('끝');
// 출력: 시작 -> 끝 -> 타이머 완료
"자바스크립트는 마치 멀티태스킹을 하는 것처럼 여러 작업을 처리할 수 있습니다. 시간이 오래 걸리는 작업(예: 서버에서 데이터 가져오기)을 실행하더라도, 그동안 다른 작업들을 계속할 수 있습니다. 마치 라면을 끓이면서 그동안 핸드폰을 하는 것처럼..."
콜백(Callback) 함수는 영문 그대로, 나중에 실행되는 함수를 뜻한다.
// 먼저 호출했지만 3초 뒤에 실행되기 때문에 2초 뒤에 실행되는 함수보다 나중에 실행된다.
setTimeout(() => {
console.log('첫번째 실행');
}, 3000);
setTimeout(() => {
console.log('두번째 실행');
}, 2000);
// 실행 순서
// 두번째 실행
// 첫번째 실행
setTimeout(() => {
setTimeout(() => {
console.log('두번째 실행');
}, 2000);
console.log('첫번째 실행');
}, 3000);
// 실행 순서
// 첫번째 실행
// 두번째 실행
첫번째 실행
-> 두번째 실행
-> 세번째 실행
순으로 실행되고function faker(callback) {
callback();
}
console.log('첫번째 실행');
faker(() => {
console.log('두번째 실행');
});
console.log('세번째 실행');
// 실행 순서
// 첫번째 실행
// 두번째 실행
// 세번째 실행
console.log('첫번째 실행');
setTimeout(() => {
console.log('세번째 실행');
}, 0);
console.log('두번째 실행');
// 실행 순서
// 첫번째 실행
// 두번째 실행
// 세번째 실행
console.log('첫번째 실행')
이 콜 스택에 들어가서 실행됩니다.setTimeout
이 콜 스택에 들어가면서Web APIs
로 보내집니다콜백 큐
로 이동합니다console.log('두번째 실행')
이 콜 스택에 들어가서 실행됩니다.콜백 함수를 콜 스택
으로 가져옵니다.console.log('세번째 실행')
이 마지막으로 실행됩니다.setTimeout(() => {
console.log('첫번째 실행');
setTimeout(() => {
console.log('두번째 실행');
setTimeout(() => {
console.log('세번째 실행');
}, 1000);
}, 1000);
}, 1000);
Promise
나 async/await
을 사용한다.Promise
는 코드의 중첩이 발생하는 콜백 지옥을 해결하기 위한 객체이다.Promise
는 단어 그대로 '약속'을 의미하며, 비동기 작업이 완료되었을 때, 성공했는지 실패했는지 알려주는 객체이다.function order(sec, callback) {
setTimeout(() => {
callback(new Date().toISOString());
}, sec * 1000);
}
order(1, (time) => {
console.log(`커피 주문`, time);
});
order(2, (time) => {
console.log(`시럽 추가 주문`, time);
});
order(3, (time) => {
console.log(`휘핑 추가 주문`, time);
});
// 실행 순서
// 동시에 실행
function order(sec, callback) {
setTimeout(() => {
callback(new Date().toISOString());
}, sec * 1000);
}
order(1, (time) => {
console.log(`커피 주문`, time);
order(2, (time) => {
console.log(`시럽 추가 주문`, time);
order(3, (time) => {
console.log(`휘핑 추가 주문`, time);
});
});
});
// 실행 순서
// 커피 주문 -> 시럽 추가 주문 -> 휘핑 추가 주문
Promise
를 사용한다.const orderCoffee = new Promise((resolve, reject) => {
// 바리스타가 커피 만드는 과정
});
const orderCoffee = new Promise((resolve, reject) => {
console.log("바리스타가 커피를 만들기 시작합니다!");
setTimeout(() => {
const isSuccess = true; // 커피가 잘 만들어졌다고 가정
if(isSuccess) {
resolve("주문하신 아메리카노 나왔습니다! ☕");
} else {
reject("죄송합니다. 머신 고장으로 제조가 불가능합니다 😢");
}
}, 3000); // 3초 동안 커피 제조중
});
// 커피 주문 결과 처리
orderCoffee
.then((result) => {
console.log(result); // "주문하신 아메리카노 나왔습니다! ☕"
})
.catch((error) => {
console.log(error); // "죄송합니다. 머신 고장으로 제조가 불가능합니다 😢"
});
Promise
는 .then
을 이용해 여러 개의 비동기 작업을 순차적으로 처리할 수 있다.// 콜백 지옥 버전
orderCoffee(function(coffee) {
addSyrup(coffee, function(withSyrup) {
addWhippedCream(withSyrup, function(complete) {
console.log("주문 완료!");
});
});
});
// Promise 버전 (깔끔!)
orderCoffee()
.then(coffee => addSyrup(coffee))
.then(withSyrup => addWhippedCream(withSyrup))
.then(() => console.log("주문 완료!"))
.catch(error => console.log("주문 실패:", error));
async/await
는 Promise
를 더 쉽게 사용할 수 있도록 ES8에서 도입된 문법이다.// 기존 Promise 방식 (진동벨)
orderCoffee()
.then(coffee => console.log("커피 완성!"))
.catch(error => console.log("주문 실패"));
// async/await 방식 (셀프 주문기)
async function orderCoffee() {
try {
const coffee = await makeCoffee(); // 커피가 완성될 때까지 기다림
console.log("커피 완성!");
} catch(error) {
console.log("주문 실패");
}
}
// 진동벨(Promise) 방식
const orderByBell = () => {
getCoffee()
.then(coffee => addSyrup(coffee))
.then(withSyrup => addWhippedCream(withSyrup))
.then(() => console.log("주문 완성!"))
.catch(error => console.log("주문 실패"));
}
// 셀프 주문기(async/await) 방식
const orderBySelf = async () => {
try {
const coffee = await getCoffee(); // 1. 커피 추출 기다리기
const withSyrup = await addSyrup(coffee); // 2. 시럽 추가 기다리기
const completed = await addWhippedCream(withSyrup); // 3. 휘핑 추가 기다리기
console.log("주문 완성!");
} catch(error) {
console.log("주문 실패");
}
}
// 실행
orderByBell(); // 진동벨 주문
orderBySelf(); // 셀프 주문기 주문
쉽고 직관적인 코드 작성이 가능하다.
async
: "셀프 주문기를 사용하겠습니다"await
: "이 작업이 끝날 때까지 기다립니다"try-catch
: "주문 실패시 환불해드립니다"