const onClickLoop = () => {
console.log("시작!!!");
setTimeout(() => {
console.log("0초 뒤에 실행된다!!!");
}, 0);
let sum = 0;
for (let i = 0; i <= 9000000000; i++) {
sum += i;
}
console.log("끝!!!");
};
위와 같은 함수가 있을 때 실행 순서를 예상해보면
위와같은 순서로 실행될 것 같지만 실제로는 아래의 순서로 실행된다.
const onClickLoop = () => {
console.log("시작!!!");
// 비동기작업(콜백함수가 매크로큐에 들어감)
setTimeout(() => {
new Promise((resolve) => resolve("철수")).then(() => {
console.log("저는 Promise(setTimeout 안에서 실행될 거예요!!!)");
});
console.log("저는 setTimeout!! 매크로큐!! 0초 뒤에 실행될 거예요!!!");
}, 0);
// 비동기작업(콜백함수가 마이크로큐에 들어감)
new Promise((resolve) => resolve("철수")).then(() => {
console.log("저는 Promise(1)!! 마이크로큐!! 0초 뒤에 실행될 거예요!");
});
// 비동기작업(콜백함수가 매크로큐에 들어감)
setInterval(() => {
console.log("저는 setInterval!! 매크로큐!! 0초마다 실행될 거예요!!!");
}, 0);
let sum = 0;
for (let i = 0; i <= 9000000000; i++) {
sum += i;
}
console.log(`sum = ${sum}`);
// 비동기작업(마이크로큐에 들어감)
new Promise((resolve) => resolve("철수")).then(() => {
console.log("저는 Promise(2)!! 마이크로큐!! 0초 뒤에 실행될 거예요!");
});
console.log("끝!!!");
};
▶ 이벤트 루프
function onClickLoop() {
console.log("=======시작!!!!=======");
function aaa() {
console.log("aaa-시작");
bbb();
console.log("aaa-끝");
}
async function bbb() {
console.log("bbb-시작");
const friend = await "철수";
console.log(friend);
}
aaa();
console.log("=======끝!!!!=======");
}
▶ await 와 마이크로태스크 큐
bbb 함수
자체가 Promise 로 변하게 되면서, function onClickLoop() {
console.log("=======시작!!!!=======");
function aaa() {
console.log("aaa-시작");
bbb();
console.log("aaa-끝");
}
async function bbb() {
console.log("bbb-시작");
await ccc(); // 힌트: ccc()가 먼저 실행되고 await가 진행됩니다.
console.log("bbb-끝");
}
async function ccc() {
console.log("ccc-시작");
const friend = await "철수";
console.log(friend);
}
aaa();
console.log("=======끝!!!!=======");
}
await "철수”
의 await)를 만나게 되면, async가 붙은 ccc 함수 자체가 중단되고, 실행되지 못한 ccc 함수들은 마이크로 태스크큐로 이동 된다.await ccc()
의 await) 를 만나게 된다.const onClickCatchFail = () => {
try {
axios.get("https://qqqqq.com");
console.log("철수"); // 로그까지 찍고, aaa 함수 정상 종료
} catch (error) {
console.log("에러가 발생하였습니다!");
}
};
const onClickCatchSuccess = async () => {
try {
await axios.get("https://qqqqq.com");
console.log("철수");
} catch (error) {
console.log("에러가 발생하였습니다!");
}
};
위와 같은 함수가 있을 때
첫번째 함수는 아래와 같은 이유로 에러를 잡지 못한다.
두번째 함수는 아래와 같은 이유로 에러를 잡는다.
첫번째 함수는 에러를 못잡고 두번째 함수는 에러를 잡는 이유
출처 : 코드캠프