FE/JavaScript
[JavaScript] 콜백 지옥 (1)
m5n
2024. 10. 15. 23:24
자바스크립트 콜백 함수
- 함수의 인자로 콜백 함수를 줘서 비동기 처리가 아닌,
- 전 함수의 값을 받아 다음 함수를 실행하는 순차적 처리가 하고 싶은 경우에 사용
목적
- 비동기로 오는 Task들을 같이 넣어줘서 동기적으로 Serialized 된 방식으로 Task를 처리하기 위해서 사용
- 사용자 입장에서는 비동기 방식이지만, 작업자(컴퓨터) 입장에서는 동기적으로 처리하는 것과 같음
- Point
- 함수를 하나의 데이터 타입으로 바라보자 !
예시 1 흐름
- (data) => {}
- data를 인자로 가지는 callbackFn을 fastFunction의 인자로 보냄 -> fastFunction 함수 진입
- fastFunction()
- setTimeout이 실행이되고 data, callbackFn모두 Background로 가서 1초(1000ms)를 기다림
- const result = data * 2 (로직 처리)
- callbackFn(result) 가 실행됨
- 여기서 callbackFn은 (data) => slowFunction(data); 임
- 즉, callbackFn(result) == slowFunction(data*2)
- 이기 때문에 slowFunction이 fastFunction이 실행된 결과 값으로 실행됨
다만,
- 예시3 처럼 콜백함수가 반복되어서 작성된다면 가독성이 매우 떨어짐 -> CallBack Hell
- Promise의 등장
Code
function fastFunction(data, callbackFn) {
return setTimeout(() => {
const result = data * 2;
console.log("fast", result);
callbackFn(result);
}, 1000)
}
function slowFunction(data, callbackFn) {
return setTimeout(() => {
const result = data + 10;
console.log("slow", result);
callbackFn(result)
}, 3000)
}
// 예시 1
fastFunction(10, (data)=> {
console.log(data);
slowFunction(data);
})
// 예시 2
fastFunction(10, (data) => {
const fastFunctionResult = data;
slowFunction(fastFunctionResult, data=> {
const slowFunctionResult = data;
console.log("fast->slow", slowFunctionResult)
})
})
// 예시 3
// initData = 30, 순서: fast -> slow -> slow -> fast
fastFunction(30, (data) => {
const fastResult1 = data;
slowFunction(fastResult1, (data) => {
const slowResult1 = data;
slowFunction(slowResult1, (data) => {
const slowResult2 = data;
fastFunction(slowResult2, (data) => {
const fastResult2 = data;
console.log(fastResult2)
})
})
})
})