TODO Project 진행 중 init시점에 저장되어 있는 데이터를 화면에 그려주기 위해 API호출을 하였고, 그 과정에서 데이터를 가져오는 로직이 비동기(async/await) 로 처리되다 보니 런타임에서는 데이터를 가져오지 못하는 현상이 발생하였습니다. 하나의 파일(같은 함수) 에서 작업할 때는 이러한 문제가 발생하지 않았는데 파일분리(다른 함수) 후 이와 같은 문제가 발생하여 관련 내용을 찾아보게 되었습니다. 이를 해결하는 과정 에서 이벤트 루프에 대해 알게 되었고 이벤트 루프가 무엇이며 어떻게 동작하는지 궁금하여 블로그를 작성하게 되었습니다
동기 방식은 서버에서 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있다
A작업이 모두 진핼 될 때까지 B작업은 대기해야한다.
function task1() {
console.log("a"); // 1
}
function task2() {
for (let i = 0; i < 1000; i++) {
console.log("b"); // 2 x 1000
}
}
function task3() {
console.log("c"); // 3
}
task1();
task2();
task3();
실행결과) a > b x 1000 > c
비동기 방식은 반대로 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행할 수 있다.
A작업이 시작되면 동시에 B작업이 시작된다. A작업은 결과값이 나오는 대로 출력 된다
웹 브라우저의 Web APIs는 비동기로 처리된다
function task1() {
console.log("a"); // 1
}
function task2() {
setTimeout(() => {
for (let i = 0; i < 1000; i++) {
console.log("b"); // 3 x 1000
}
}, 100);
}
function task3() {
console.log("c"); // 2
}
task1();
task2();
task3();
실행결과) a > c > b x 1000
이벤트 루프는 현재 실행중인 태스크가 없는지, 태스크 큐에 태스크가 있는지를 반복적으로 확인하는 역할을 한다.
- 모든 비동기 API들은 작업이 완료되면 콜백 함수를 태스크 큐에 추가한다
- 이벤트 루프는 현재 실행중인 태스크가 없을 때 태슼느 큐의 첫 번째 태스크를 꺼내와 실행한다
function delay() {
for (var i = 0; i < 100000; i++);
}
function foo() {
delay();
console.log('foo!'); // 1
}
function bar() {
delay();
console.log('bar!'); // 2
}
function baz() {
delay();
console.log('baz!'); // 3
}
setTimeout(foo, 10);
setTimeout(bar, 10);
setTimeout(baz, 10);
실행결과) foo! > bar! > baz!
참고