
참고: https://www.youtube.com/watch?v=8aGhZQkoFbQ









동기적으로 ajax요청을 보내는 jQuery 함수 getSync

코드를 실행해서 getSync를 호출하면 응답을 기다리게 된다.


이렇게 다음줄로 넘어가고 기다리는 반복을 하게된다.

프로그래밍 언어에서 싱글 스레드라고 하는 것은 여러개의 스레드를 사용하지 않는다는 의미이다.
네트워크 요청을 하고는 끝날때까지 기다린다.
이때, 문제는 웹브라우저에서 코드가 실행된다는 것이다.
getAsync와 같이 요청을 보냈을 때에는 아무 것도 실행시킬 수 없다.
브라우저는 모든 리퀘스트가 완료될 때까지 멈춰있는다.
리퀘스트가 끝나기전에 어떤 것을 실행 한다면, 동기적으로 실행되는 네트워크 요청이 콜 스택을 블로킹 하여, 브라우저는 다른 일들을 할 수없다. 렌더링이나 다른 코드를 실행하지 못하고 그냥 멈춰버린다.
유려한 UI를 만들기 위해서는 콜스택을 멈추게하면 안된다.
=> 이를 해결하기 위해선 비동기 콜백이 필요하다.
자바스크립트는 싱글스레드로 동작하지만, 비동기 작업 처리를 위해 웹API를 활용하여 멀티스레드와 유사한 효과를 얻는다.
웹 브라우저나 Node.js와 같은 환경에서 제공하는 Web API는 백그라운드에서 동작하며, 여러 작업을 병렬로 처리할 수 있다.
예를 들어, setTimeout, XMLHttpRequest, fetch 등은 Web API를 사용하여 비동기적으로 동작하며, 이는 브라우저의 백그라운드 스레드에서 처리된다.
이벤트 루프는 콜 스택이 비어있을 때, 콜백 큐에서 콜백 함수를 꺼내와 실행하는 역할을 한다.
Web API에서 비동기 작업이 완료되면 해당 작업의 콜백 함수가 콜백 큐에 쌓이게 됩니다.
이벤트 루프는 콜 스택이 비어질 때마다 콜백 큐에서 콜백 함수를 꺼내와 콜 스택에 넣어 실행한다.
Promise는 동기처리이다
Promise자체는 동기이지만 then을 만나면 비동기로 동작하게 된다.
(엔진은 then을 비동기로 인식한다) 따라서 then으로 인해 Promise는 WebAPI로 넘어가게 된다.

WebAPI에 timeOut과 Promise 둘 다 있으면 누가 먼저 끝날지는 모르지만 timeOut이 먼저 끝난다고 가정해 callback queue에 timeOut, Promise 순으로 들어간다.

이 때 Event Loop는 Call Stack안에 Context 유무를 확인 하고 Callback Queue에서 then의 익명함수를 먼저 CallStack으로 보낸다.
timeOut이 먼저 들어왔음에도 then의 익명함수가 먼저 Call Stack으로 들어간 이유는 우선순위 때문이다
출력결과

