1 분 소요

시작하기 앞서…
javascript는 동기적이다. 즉, hoisting이 된 이후부터는 위에서부터 아래로 코드가 나타나는 순서대로 작동한다.
hoisting: var 변수나 함수 선언들이 자동으로 제일 위로 올라가는 것

Callback

setTimeout(() => console.log('hi'), 1000);

이때 setTimeout 메서드 안에 있는 함수(console.log('hi'))를 콜백함수라고 한다.
해당 콜백함수는 바로 실행되는 것이 아니라 1000ms(1초)가 지난 뒤에 실행된다.
Callback 함수: “나중에 다시 불러줘” 하면서 전달하는 함수

Synchronuous callback

즉각적으로 실행하는 동기적 콜백

function printImmediately(print){
    print();
}

printImmediately(() => console.log('sync callback'));

Asynchronuous callback

나중에 언제 실행될지 예측할 수 없는 비동기적 콜백

function printWithDelay(print, timeout){
    setTimeout(print, timeout);
}

printWithDelay(() => console.log('async callback'), 2000);

😈 콜백 지옥 체험

class UserStorage{
    loginUser(id, password, onSuccess, onError){
        setTimeout(() => {
            if((id === 'ann' && password === 'hello') || (id === 'coder' && password === 'academy')){
                onSuccess(id);
            }else{
                onError(new Error('not found'));
            }
        }, 2000);
    }
    
    getRoles(user, onSuccess, onError){
        setTimeout(() => {
            if(user === 'ann'){
                onSuccess({name: 'ann', role: 'admin'});
            }else{
                onError(new Error('no access'));
            }
        }, 1000);
    }
}

const userStorage = new UserStorage();
const id = prompt('Enter your id');
const password = prompt('Enter your password');
userStorage.loginUser(
    id,
    password,
    user => {
        userStorage.getRoles(
            user,
            userWithRole => {
                alert(`Hello ${userWithRole.name}, you have a ${userWithRole.role} role.`);
            },
            error => { console.log(error); }
        )
    },
    error => { console.log(error); }
);

콜백 체인의 문제점?
이처럼 콜백함수 안에서 다른 것을 호출하고 그 안에서 또 다른 콜백을 전달하고 그 안에서 다른 것을 호출하고…😱
이런 것을 콜백지옥이라고 하는데, 이런 코드는

  1. 가독성이 떨어진다
  2. 에러가 발생했을 경우 디버깅을 하기 굉장히 어렵다.
  3. 유지 보수가 어렵다.

따라서 다음 시간에 promiseasync, await을 이용해 어떻게 비동기 코드를 깔끔하게 작성할 수 있는지, 조금 더 병렬적이고 효율적으로 네트워크 통신을 어떻게 할 수 있는지 알아볼 예정이다.

📁 참고

DreamCoding



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기