const first =()=>console.log("첫번째")
const second=()=>setTimeout(()=>console.log("두번째"),500)
const third=()=>console.log("세번째")
first()
second()
third()
//출력결과
"첫번째"
"세번째"
"두번째"
브라우저에는 자바스크립트 엔진 자체가 제공하는 몇 가지 기능을 제공하는데 바로 “Web API”이다
Web API에는 DOM API , setTimeout,HTTP request 등 포함되어 있다. 이것들이 바로 우리가 async한(막히지 않는) 개발을 할 수있게 도와준다.
우리가 한 함수를 호출하게 되면 그것은 call stack이라는 곳에 추가된다. Call stack은 자바스크립트 엔진의 일부분으로 명확히 따지면 브라우저가 아니다.
그냥 하나의 스택인데 ‘선입후출’ 시스템으로 실행된다. 따라서 우리가 호출한 함수가 값을 리턴하면, 그 함수는 스택에서 빠져 나온다.
function good(){
return "Hi"
}
function smell(){
return setTimeout(()=>{
return "Bad"
},1000)
}
여기서 setTimeout()은 Web API가 제공하고, 메인 스레드를 막지않고 일을 수행하도록 도와준다.
그 다음 , setTimeout의 콜백함수인 {return “Bad”}는 Web API에 추가된다. 그러고 smell()과 setTimeout()은 스택에서 빠져나오고 값을 리턴한다.
setTimeout()은 Web API에서 1000ms 동안 돌아간다. 이러고나서 call stack으로 바로 가지 않고 queue공간으로 간다. (Call stack과 연관이 전혀 없는 제 3자의 공간이라 생각하면 된다. )
💡 근데 여기서 1000ms 이후에 call stack으로 추가되는 것이 아니다.
💡 그건 1000ms 이후에 단순히 queue에 넣어지는 것이고 , 해당 함수는 자신의 차례가 올 때까지 기다려야 한다.
위에 과정이 이루어지면 event loop가 나온다. Event loop는 만약에 call stack이 비어지면(=다른 함수들이 return되면 ) call stack과 queue를 이어준다. 그러고 queue에 있던 첫번째 항목이 call stack에 추가된다.
이 때 다른 함수들은 호출되지 않는데 queue에서 첫번째 항목일 때 call stack이 비어졌다는 뜻이다.
💡 콜백함수가 call stack에 추가되고 → 호출한다면→ 값을 리턴→ 스택에서 빠져나옴
콜백을 받는 Promise 생성자를 통해 promise를 생성할 수 있다.
다 비동기 처리이며 우선순위로 따지면
💡 call stack에 즉시 추가되는 함수 > Promise call back함수> SetTimeout
이렇게 작동된다.
console.log("첫번째")
setTimeout(()=>{
console.log("timeout")})
Promise.resolve("Promise")
.then(res=>console.log(res))
console.log("마지막")
//출력결과
"첫번째"
"마지막"
"Promise"
"timeout"
위와 마찬가지로 Promise는 Micro Task Queue 에 setTimeout은 macroTask Queue에 추가된다