- 동기와 비동기의 개념과 용도에 대해서 알아본다.
동기
식 처리 방식 : 요청을 보내고 응답을 받은 후에 다음 동작을 실행한다.
비동기
식 처리방식 : 요청을 보내고 응답에 관계 없이 다음 동작을 실행한다.
아래의 코드는 A → B → C
순으로 출력된다.
function func1() { console.log('A'); func2(); } function func2() { console.log('B'); func3(); } function func3() { console.log('C'); } func1();
아래의 코드에서 setTimeout
메소드는 비동기 함수이므로 interval이 0이어도 A → C → B
순으로 출력된다.
function func1() { console.log('A'); func2(); } function func2() { setTimeout(function() { console.log('B'); }, 0); func3(); } function func3() { console.log('C'); } func1();
Call Stack
에 쌓인다.Call Stack
에 쌓인다.Call Stack
에 쌓인다.Web APIs
는 Call Stack
의 setTimeout 메소드가 비동기임을 확인하고 Web APIs
로 이동시킨 뒤 setTimeout 메소드 내부의 Run함수를 호출한다.(타이머 시작)Call Stack
에 쌓인다.Event Queue
로 콜백함수가 이동한다. Call Stack
이 비면 Call Stack
으로 이동하고, 실행된다.
- 비동기 처리 방식의 문제점을 확인한다.
- 비동기 흐름을 동기식으로 컨트롤할 수 있는 해결책을 알아본다.
비동기 처리의 가장 대표적 사례가 jQuery의 ajax이다.
아래의 jQuery ajax 비동기 통신 예제를 살펴보자.
ajax를 통해 특정 url에 HTTP GET 방식으로 데이터를 요청하고 받아온 응답을 출력하려고 한다.
function getData() { var tableData; $.get('url', function (response) { tableData = response; }) // $.get()로 데이터를 요청하고 받아올 때까지 기다리지 않고 return return tableData; } console.log(getData()); //undefined
그러나 의도와 다르게 getData()의 결과값, 즉 tableData는 undefined
를 갖는다.
∵ getData()를 호출하고 특정 서버(url)로의 요청에 대한 응답(response)을 받기도 전에 return 해버렸기 때문이다.
return tableData;
가 먼저 실행되었기때문에 getData 메소드는 원하는 응답을 tableData에 담아오지도 못하고 종료된다.
⇒ 이 문제를 해결하려면 tableData = response;
가 실행 될 때까지 return tableData;
가 대기하도록 만들어야 한다.
⇒ 즉, 해결책은 비동기를 동기적인 흐름으로 다루는 것!
해결법 3가지를 살펴본다.
1. 콜백함수 이용
2. Promise 이용
3. async/await 이용
구체적인 내용은 다음 포스팅에서 알아본다.