Skip to main content

Command Palette

Search for a command to run...

Asynchronous Programming In Javascript - Event Loop

Published
•2 min read•View as Markdown

1] Synchronous and Asynchronous Actions

동기 처리의 경우, 함수를 호출한 후, return이 올 때 까지 기다린다. 그 후 다음 statement를 진행한다.

비동기 처리의 경우, 함수를 호출하고 return을 기다리지 않고 바로 다음 statement를 진행한다. 그 후 callback이 실행이 된다.

2] Example of Asynchronous Actions

  1. setTimeout

  2. HTTP requests 보내기

  3. reading and writing data to files(파일에서 읽기와 파일에 쓰기)

  4. DB에 query 보내기 등...

3] Event Loop in Javascript

Javascript는 위 그림과 같이 fucntion one(), two(), three(), four()를 생성하고 실행시켰을 경우, 다음과 같이 진행된다.

  1. Global execution context을 만들고 Call stack에 넣는다.

  2. 이렇게 모든 함수를 선언하면 밑에 쓰여진 대로 one() 에 도달하게 된다.

  3. 새로운 Execution context를 Call stack의 맨 위에 생성한다.(이 Execution context는 인자, 지역변수와 함께 one()를 나타낸다.)

  4. one()으로 들어가서, 실행하고, 끝나면 Call stack 맨 위의 execution context(새로 추가한 execution context)를 제거한다.

  5. 똑같이 two()에 도달하면, 새로운 Execution context를 생성하고, two() 안의 getNumber2()가 새로운 함수이기 때문에 또 새로운 Execution context를 생성한다.

  6. 그 후, getNumber2()가 리턴되고, EC(Execution context)가 제거되며, two()가 리턴되고, EC가 또 제거된다.

  7. three()로 들어가서 새로운 EC를 생성하고 실행하는데, setTimeout이 비동기 함수이기 때문에, Javascript가 리턴을 기다리지 않는다. 따라서 다음으로 이동한다.

  8. 따라서 EC를 제거하고, four()로 가서 새로운 EC를 생성한다.

  9. setTimeout이 끝났을 경우, console.log(3)을 실행하는 것이 아니라, 이 새로운 task를 Message queue(Task queue)에 추가한다. 이 task는 callback에 대한 참조가 있다.

  10. 이 callback은 Call stack이 비지 않았으므로 실행이 되지 않고, four()가 실행되고, EC를 제거한다.

  11. 끝에 도달하면, Global execution context가 Call stack에서 제거된다.

  12. Call stack이 빌 때마다, Javascript engine은 Message queue에 뭔가 있는지 확인한다.

  13. 이 때는 1개의 task가 Message queue에 있게 되므로, Javascript engine은 Message queue에서 task를 가져와 Call stack에 새로운 EC를 생성한다.

  14. 그 후 오직 callback만을 실행하고 끝나면 EC가 call stack에서 제거된다.

  15. 그러면 Javascript가 Call stack을 체크하고, 없으면 Message queue를 다시 체크한다.

  16. 다 없으므로, Javascript engine이 종료된다.

따라서 결과는 1 2 3 4 가 아닌 1 2 4 3 이 나오게 된다.

4] Fix

four()를 three() 안에 넣어주면 된다.

function three() {
  setTimeout(function () {
    console.log(3);
    four();
  }, 0);
}

More from this blog

RFC 9110 HTTP Semantics - TRACE

1] TRACE trace는 요청 메시지의 원격 application-level의 loop-back을 요청한다. 요청의 최종 수신자(final recipient)는 민감한 데이터를 포함한 필드를 제외하고 수신한 메시지를 200(OK) 응답의 내용으로 클라이언트에 다시 반영해야 합니다.(should) message/http 형식은 이를 수행하기 위한 한 가지 방법이다. 최종 수신자는 Origin Server이거나 요청에서 Max-Forwards ...

Nov 28, 20241 min read

RFC 9110 HTTP Semantics - POST

1] POST POST 메서드는 target resource가 리소스 자체의 특정한 의미에 따라 요청에 포함된 representation을 처리하도록 요청한다. 예를 들어, 다음의 기능을 수행한다. HTML form에 입력된 필드같은 데이터 블록을 데이터 처리 프로세스에 제공 게시판, 뉴스 그룹, 메일링 리스트, 블로그, 또는 비슷한 기사 그룹에 메시지 게시(posting) origin server에서 식별되지 않은 새로운 리소스 생성 ...

Nov 2, 20242 min read

RFC 9110 HTTP Semantics Method Definitions GET

1] GET GET Method는 대상 리소스에 대한 현재 선택된 representation의 전송을 요청한다. 성공적인 응답은 대상 URI가 식별한 동일성의 품질을 반영한다.(계속 요청하면 항상 동일한 응답을 줌) 따라서 HTTP를 통해 식별 가능한 정보를 검색하는 것은 일반적으로 GET 요청을 통해 수행되며 200(OK) 응답을 준다. 리소스 식별자를 원격 파일 시스템 경로명으로, representation을 해당 파일 콘텐츠의 복사본으로 ...

Oct 9, 20243 min read

Spring Data JPA Dynamic Projections

1] 기존 Projections 특정한 Entity의 컬럼을 전부 가져오고 싶지 않을 때, 기존의 경우는 메서드마다 record를 생성하였다. 이때, 출처에서 적힌 것처럼, 여러 메서드가 하나의 record를 쓰는 경우가 생기게 된다. 예를 들어, 컬럼이 id, name, genre, 등등이 있을 때 기존에 id와 name만을 가져오는 record가 있을 경우 id, name, genre를 가져오는 메서드를 만들 경우 기존의 record에 ge...

Sep 25, 20242 min read

Jong-Dae's Coding Docs

17 posts