봉봉의 개인 블로그
2019-02-11(Java Script 비동기 처리와 콜백함수) 본문
자바스크립트 비동기 처리와 콜백 함수
비동기 처리란?
비동기 처리의 첫번째 사례
1 2 3 4 5 6 7 8 9 10 | function getData() { var tableData; $.get('https://domain.com/products/1', function (response) { tableData = response; }); return tableData; } console.log(getData()); //undefined | cs |
여기서 $.get() 은 AJAX 통신을 하는 부분이다. https://domain.com 에 HTTP GET 요청을 날려 1번 상품(product) 정보를 요청하는 코드다.
그렇게 받아온 데이터는 response에 담기게 되고 tableData 변수에 저장한다. 그후 getData()를 호출해 보자. console.log 로 결과를 찍어보면 결과는 undefined가 나오게 된다. 이유는 AJAX 호출시 데이터를 요청하고 데이터를 받아올떄까지 기다리지 않고 다음 코드(return tableData;)를 실행한다. 따라서 console.log 에는 undefined가 나오게 된다.
이렇게 특정 로직의 실행이 끝날때 까지 기다려 주지 않고 나머지 코드를 먼저 실행하는 것이 비동기 처리이다.
비동기 처리가 필요한 이유는 화면에서 서버로 데이터 요청시 요청에 대한 응답을 마냥 기다릴수 없기 때문이다. 만약 100개의 요청을 보낸다고 하면 코드가 요청이 끝날때까지 기다리고를 반복하여 웹애플리케이션이 느려지게 될것이다.
비동기 처리의 두번째 사례
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | console.log('Hi'); setTimeout(function (){ console.log('Hi2'); },3000); console.log('Hi3'); /* 결과 Hi Hi3 Hi2 */ | cs |
setTimeout() 역시 비동기 방식으로 실행되기 때문에 3초를 기다렸다가 다음코드를 수행하는 것이 아니라 일단 setTimeout() 을 실행하고 나서 바로 다음 코드인 console.log('Hi3'); 으로 넘어가게 된다.
콜백 함수로 비동기 처리 방식의 문제점 해결
1 2 3 4 5 6 7 8 9 | function getData(callbackFunc) { $.get('https://domain.com/products/1', function(response) { callbackFunc(response); //서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌 }); } callbackFunc(function (tableData) { console.log(tableData); // $.get()의 response 값이 tableData에 전달됨 }); | cs |
이렇게 콜백 함수를 사용하면 특정 로직이 끝났을 때 원하는 동작을 실행시킬 수 있다.
비유로 이해하는 콜백 함수 동작 방식
콜백 지옥
1 2 3 4 5 6 7 8 9 | $.get('url', function(response) { parseValue(response, function(id) { auth(id, function(result) { display(result, function() { console.log(text); }); }); }); }); | cs |
콜백 지옥을 해결하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function parseValueDone(id) { auth(id, authDone); } function authDone(result) { display(result, displayDone); } function displayDone(text) { console.log(text); } $.get('url', function() { parseValue(response,parseValueDone); }); | cs |
위 코드는 앞의 콜백 지옥 예시를 개선한 코드이다. 중첩해서 선언했던 콜백 익명 함수를 각각의 함수로 구분하였다. 정리된 코드를 간단하게 살펴 보면, 먼저 AJAX통신으로 받은 데이터를 parseValue() 메서드로 파싱한다. parseValueDone()에 파싱한 결과값인 id가 전달되고, auth() 메서드가 실행된다. auth() 메서드로 인증을 거치고 나면 콜백 함수 authDone()이 실행된다. 인증 결과 값인 result로 display()를 호출하면 마지막으로 displayDone() 메서드가 수행되면서 text가 콘솔에 출력된다.
출처 : https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/
'입사후 공부한내용' 카테고리의 다른 글
2019-02-13(JavaScript IIFE 란?) (0) | 2019.02.13 |
---|---|
2019-02-13(JavaScript 클로저) (0) | 2019.02.13 |
2018-12-18(JavaScript Hoisting 호이스팅) (0) | 2018.12.18 |
2018-09-18(JSTL의 기본적인 사용 문법) (0) | 2018.09.18 |
2018-09-17(리눅스의 퍼미션) (0) | 2018.09.17 |