비동기 코드 / 호출 스택
호출 스택이란 함수가 호출되면 스택에 쌓이는 것을 의미한다.
그러나실제 호출 스택으로는 밑에 코드와 같이 비동기 함수의 작동은 알 수 없다.
function run(){
console.log("3초 후 실행");
}
console.log("시작")
setTimeout(run, 300); # 대포적인 비동기 함수
console.log("끝")
이벤트 루프 원리
- setTimeout과 같은 비동기 함수를 이해하기 위해서는 다음과 같은 구조를 이해하고 있어야 한다.
function run(){
console.log("3초 후 실행");
}
console.log("시작")
setTimeout(run, 300); # 대포적인 비동기 함수
console.log("끝")
- 메모리에
run 함수
가 올라온다. console.log("시작")
가 호출 스택에 올라온다.시작
출력console.log("시작")
가 호출 스택에서 빠져나간다.setTimeout(run, 300);
가 호출 스택에 올라온다.- 백그라운드에
타이머(run, 3초)
가 올라온다.- 호출스택이 실행되면서 백그라운드도 동시에 실행된다.
- 백그라운드에 갈 수 있는 함수는 매우 제한적이다.
- ex setTimeout(), class Promise, etc..
console.log("끝")
가 호출 스택에 올라오고끝
을 출력 그리고console.log("끝")
가 호출 스택에서 빠져나간다.- 백그라운드의
타이머(run, 3초)
함수가 3초가 끝나면run 함수
를 태스크 큐에 올라온다. - 태스크 큐는 호출 스택이 비어있으면
run 함수
를 호출 스택에 올린다.
설명은 간략화 했지만 실제는 복잡한 코드로 구현되어 있다.
백그라운드에 우선순위
- 내용이 어려워서 나중에 다시 기록한다. 인프런 8강 13분~
- Promise. the/catch
process.nextIck 등은 setTimeout()와 같이 태스크 큐에 들어가면 setTimeout이 가장 늦게 실행된다.
function oneMore(){
console.log('one more');
}
function run(){
console.log('run run');
setTimeout(() => {
console.log('wow');
}, 0)
new Promise((resolve) => {
resolve('hi');
})
.then(console.log);
oneMore();
}
setTimeout(run, 5000);
핑백: Express앱에서 미들웨어 사용하기 - CherryPichu 블로그