javascript-010 - 비동기 처리의 시작 콜백 이해하기, 콜백 지옥 체험

1 분 소요

callback

자바스크립트는 동기적임

호이스팅(hoisting)된 이후 순서대로 실행됨

호이스팅(hoisting) : var, funciton 선언이 제일 위로 올라가는 현상

console.log('1'); 
console.log('2');
console.log('3');
// 1, 2, 3

console.log('1');
setTimeout(() => {
  console.log('2')
}, 1000)
console.log('3');
// 1, 3, 2

동기형 콜백

function printImmediately(print) {
  print();
}
printImmediately((()=> console.log('hello'));
// 호출 즉시 실행

비동기형 콜백

function printWithDelay(print, timeout) {
  setTimeout(print, timeout);
}
printWithDelay(() => console.log('async callback'), 2000);
// 2초 뒤에 실행

callback 지옥 체험

class UserStorage {
  loginUser(id, password, onSuccess, onError) {
    setTimeout(() => {
      if (
        (id  === 'ellie' && password === 'dream') ||
        (id === 'coder' && password === 'academy')
      ) {
        onSuccess(id);
      } else {
        onError(new Error('not found'));
      }
    },2000)
  };

  getRoles(user, onSuccess, onError) {
    setTimeout() => {
      if(user === 'ellie') {
        onSuccess({ name: 'ellie', role: 'admin' });
      } else {
        onError(new Error('no access'));
      }
    }
  }, 1000)
}

위 함수들을 활용하여 진행

const userStorage = new UserStorage();
const id = promt('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);
})

참고

  • [https://youtu.be/s1vpVCrT8f4]