Web JavaScript Callback 함수

Call Back 함수

Java Script의 처리 순서는 위에서 아래로 진행이 된다. 여기서 동기 처리와 비동기 처리로 구분할 수 있다.

Synchronous callback (동기 콜백)

function printImmediately(print) {
	print();
}
printImmediately(()=> console.log('hello'));
printImmediately() 함수에 print라는 함수를 넣고 그대로 실행하게 한다.

Asynchronous callback (비동기 콜백)

function printWirthDelay(print, timeout) {
	setTimeout(print,timeout);
}
printWirthDelay(()=>console.log('asynce callback'),2000);
만약 순서를 비동기 콜백을 진행하고 동기 콜백함수를 차례로 아래와 같이 선언 하였다면
printWirthDelay(()=>console.log('asynce callback'),2000);
printImmediately(()=> console.log('hello'));
hello가 먼저 출력이 되고 asynce callback 은 2초뒤에 출력이 되는것을 확인 할 수 있다.

Call back Hell (콜백 지옥)

콜백 함수만을 사용하게 되면 함수에 함수를 호출 할때 콜백 지옥을 경험하게 된다.
// 클래스 생성
class UserStorage{
	//로그인시 함수
	loginUser(id, password, onSuccess, onError){
		setTimeout(()=>{
			if(
				(id==='Kim' && password === 'byungin')||
				(id==='coder' && password === 'example')
			){
				onSuccess(id);
			}else{
				onError(new Error('not found'));
			}
		},2000);
	}
	// 역할을 가져오는 함수
	getRoles(user,onSuccess, onError){
		setTimeout(()=>{
			if(user === 'Kim'){
				onSuccess({name:'Kim',role:'admin'});
			}else{
				onError(new Error('no access'));
			}
		}, 1000);
	}
}

const userStorage = new UserStorage();
const id = prompt('id 입력');
const password = prompt('비번 입력');
userStorage.loginUser(
	id,
	password,
	user =>{ 
		userStorage.getRoles(user,userWithRole =>{ //getRoles에 있는 함수를 다시 실행하여 진행
			alert(`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`);
		}, 
		error =>{
			console.log(error);
		}
		);
		
	},
	error =>{
		console.log(error);
	}
);
만약 함수의 함수로 복잡하게 진행이 된다면, 1. 가독성이 매우 떨어진다 . 2. 유지 보수시 힘들어진다. 3. 디버깅을 할때도 어려워 진다.
위와 같은 상황을 보완하고자 promise와 async와 await 기능이 있다.