콜백(Callback)함수란?
다른 함수의 인자로 전달되는 함수이다.
function main(callback) {
callback();
}
main(() => console.log());
위 코드의 main 내부의 callback과 같은 인자로 전달되는 함수를 뜻한다.
비동기 콜백
콜백함수 자체는 비동기와 관련이 없으나, 요청과 결과가 동시에 주어지지 않는 비동기 작업에서 유용하게 사용된다.
function getData(callback) {
setTimeout(() => {
console.log('Received data from server!');
callback();
}, 1000);
}
getData(() => {
console.log('Post process!');
});
// 결과: Received data from server! Post process!
위 예시의 getData()의 경우 setTimeout() 이라는 비동기 함수가 실행된다. setTimeout() 이후 console.log('Post process!') 를 실행하게 하려면 getData()의 인자에 실행하려는 작업(콜백함수)를 넣으면 된다.
콜백지옥
이처럼 비동기 작업에서 유용하게 쓰이는 콜백함수도 단점이 있다. 바로 지나친 콜백은 콜백지옥을 유발한다는 점이다.
function a(data, callback) {
setTimeout(() => {
callback(data);
}, 1000);
}
function b(data, callback) {
setTimeout(() => {
callback(data);
}, 1000);
}
function c(data, callback) {
setTimeout(() => {
callback(data);
}, 1000);
}
a('A!!', (a) => {
console.log(a);
b('B!!', (b) => {
console.log(b);
c('C!!', (c) => {
console.log(c);
});
});
});
// 결과: A!! B!! C!!
위 예시의 a, b, c 함수의 A!! B!! C!! 문구를 순서대로 출력하기 위해 콜백함수로 구성하였다. 비록 의도대로 작동은 하지만, 너무 많은 콜백으로 코드를 해석하기 쉽지 않다. 이러한 콜백지옥을 해결하기 위해 JavaScript에는 Promise 라는 객체가 존재한다. Promise에 대해서는 다음 글에서 정리하도록 하겠다.
출처
'Language > JavaScript' 카테고리의 다른 글
| [JavaScript] 동기 vs 비동기 (0) | 2024.12.12 |
|---|---|
| [JavaScript] 논리연산자와 쇼트서킷 (1) | 2024.03.07 |
| [JavaScript] 문자열을 숫자로 바꾸는 방법 (0) | 2024.03.01 |
| [JavaScript] 날짜 정보 객체(Date Object) (0) | 2023.06.23 |