[Javascript] 비동기 처리와 콜백 함수
서버로 요청을 보내는 jQuery의 $.get() 함수를 살펴보자.
function printData() { var data; $.get('/domain', function(responseData) { data = responseData; }); console.log(data); // undefined가 출력된다. } printData();
위의 코드에서 $.get()은 비동기 함수이기 때문에 data 변수에 어떠한 값이 담기기도 전에 반환된다. 따라서, undefined를 출력한다.
다음으로 Javascript 자체적으로 지원해주는 setTimeout() 함수도 대표적인 비동기 함수이다.
console.log("1"); setTimeout(function() { console.log("3"); }, 3000); console.log("2");
내가 원하는 로직을 비동기 함수 안에 콜백 함수의 형태로 넣어주면, 실행 흐름이 완벽하게 보장된다.
비동기 함수인 ajax가 서버에서 언제 데이터를 받아오든간에 데이터를 받아온 다음에야 콜백 함수가 실행되기 때문이다.
function printData(callbackFunc) { $.get('/domain', function(responseData) { callbackFunc(responseData); }); } printData(function(data) { console.log(data); });
서버에서 받아온 데이터를 콜백 함수의 파라미터로 넘겨주며 콜백 함수를 실행하고 있다.
그런데 만약 콜백 함수로 넘어온 파라미터 값을 가공한 후에, 다시 콜백 함수로 데이터를 넘겨주고 실행하면 어떻게 될까?
function printData(callbackFunc) { $.get('/domain', function(responseData) { // 서버에서 받아온 responseData로 콜백 함수를 실행한다. callbackFunc(responseData, function(id) { // parseData 함수가 데이터를 파싱해 id값을 추출하여, 다시 콜백 함수를 실행한다. auth(id, function(result) { // auth() 함수로 인증이 성공하면, 다시 콜백 함수를 실행한다. display(result, function(text) { console.log(text); }); }); }); }); } function parseData(data, callbackFunc) { // 1. 파라미터로 넘어온 data를 파싱한다. ( 여기선 그냥 data를 넣었는데, 파싱된 데이터라 가정하자. ) const parsingData = data; // 2. 파싱한 데이터를 콜백 함수의 파라미터로 넘겨주며 실행한다. callbackFunc(parsingData); } printData(parseData);
콜백 함수에서 다시 콜백 함수를 실행하고, 거기서 다시 콜백 함수를 실행한다.
이렇게 비동기 함수에서 동기성을 보장하기 위해 꼬리에 꼬리를 무는 식으로 콜백 함수를 반복 사용하는 것을 콜백 지옥이라 한다. ( Callback Hell )
콜백 지옥을 극복하기 위해 ES6에서 promise 문법이 추가되었고, promise를 한 번 더 보기좋게 만든게 async/await이다.
'Web > Javascript' 카테고리의 다른 글
[Javascript] DataTables (0) | 2020.04.02 |
---|---|
[Javascript/jQuery] .find() 함수 (1) | 2020.03.27 |
[Javascript] for문 ( forEach, for...in, for, for...of ) (0) | 2020.02.21 |
[Javascript] 객체(Object)의 키와 값 가져오기 (0) | 2020.02.20 |
[Javascript] Ajax 요청 (0) | 2020.02.11 |
댓글
이 글 공유하기
다른 글
-
[Javascript] DataTables
[Javascript] DataTables
2020.04.02 -
[Javascript/jQuery] .find() 함수
[Javascript/jQuery] .find() 함수
2020.03.27 -
[Javascript] for문 ( forEach, for...in, for, for...of )
[Javascript] for문 ( forEach, for...in, for, for...of )
2020.02.21 -
[Javascript] 객체(Object)의 키와 값 가져오기
[Javascript] 객체(Object)의 키와 값 가져오기
2020.02.20
댓글을 사용할 수 없습니다.