고슴맨쉬
망치와 공(空)
고슴맨쉬
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • Props
  • redux
  • object
  • useEffect
  • axios
  • 오류
  • json
  • TypeScript
  • state
  • JavaScript
  • 프로그래머스
  • array
  • class
  • react
  • CSS
  • 코딩애플
  • 삼항연산자
  • UXUI
  • CS
  • Ajax
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
고슴맨쉬

망치와 공(空)

🟨 JavaScript/개념

[드림코딩] 콜백함수 (4) : 콜백지옥 탈출, Promise (callback hell 코드개선하기)

2022. 10. 4. 17:44

Callback Hell 예시

이전시간에 만들었던 콜백지옥 예시다.

// 기본세팅
class UserStorage {
  loginUser(id, password, onSuccess, onError) {
    setTimeout(() => {
      if (
        (id === 'master' && password === 'master00') ||
        (id === 'submaster' && password === 'submaster00')
      ) {
        onSuccess(id);
      } else {
        onError(new Error('not found'));
      }
    }, 2000);
  }
  
  getRoles(user, onSuccess, onError) {
    setTimeout(() => {
      if (user === 'master') {
        onSuccess({name: 'Master', role : 'admin'});
      } else {
        onError(new Error('Go away!'));
      }
    }, 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);
  }
);

이를 promise를 이용해 깔끔하게 개선해 보자.


개선된 코드

class UserStorage {
  loginUser(id, password) { //onSuccess, onError같은 콜백함수를 만들 필요가 없다.
    return new Promise((resolve, reject) => { //새로운 promise를 만든다.
      setTimeout(() => {
        if (
          (id === 'master' && password === 'master00') ||
          (id === 'submaster' && password === 'submaster00')
        ) {
          resolve(id); //onSuccess 대신 resolve
        } else {
          reject(new Error('not found')); //onError 대신 reject
        }
      }, 2000);
    });
  }
  
  getRoles(user) {//onSuccess, onError같은 콜백함수를 만들 필요가 없다.
    return new Promise((resolve, reject) => { //새로운 promise를 만든다.
      setTimeout(() => {
        if (user === 'master') {
          resolve({name: 'Master', role : 'admin'}); //onSuccess 대신 resolve
        } else {
          reject(new Error('Go away!')); //onError 대신 reject
        }
      }, 1000);
    });
  }
}


const userStorage = new UserStorage();
const id = prompt('Enter your id');
const password = prompt('Enter your password');

userStorage
  .loginUser(id, password)
  .then(userStorage.getRoles) //.then(user => userStorage.getRoles)에서 축약 가능 (인자가 같으므로)
  .then(user => alert(`Hello ${user.name}, you have a ${user.role} role`))
  .catch(console.log);

출처 : 드림코딩 https://www.youtube.com/@dream-coding / MDN https://developer.mozilla.org/ko/

저작자표시 비영리 동일조건 (새창열림)

'🟨 JavaScript > 개념' 카테고리의 다른 글

[코딩애플] 요소의 높이와 위치값 구하기 (clientHeight, offsetHeight, scrollHeight, getBoundingClientRect())  (0) 2023.01.11
[코딩애플] 스크롤 이벤트  (0) 2023.01.11
[드림코딩] 콜백함수 (3) : promise로 Error Handling하기 (reject, catch 활용)  (0) 2022.10.04
[드림코딩] 콜백함수 (2) : 콜백지옥 탈출, Promise (State, Producing)  (0) 2022.07.22
[드림코딩] 콜백함수 (1) : 콜백지옥 예시  (0) 2022.07.22
    '🟨 JavaScript/개념' 카테고리의 다른 글
    • [코딩애플] 요소의 높이와 위치값 구하기 (clientHeight, offsetHeight, scrollHeight, getBoundingClientRect())
    • [코딩애플] 스크롤 이벤트
    • [드림코딩] 콜백함수 (3) : promise로 Error Handling하기 (reject, catch 활용)
    • [드림코딩] 콜백함수 (2) : 콜백지옥 탈출, Promise (State, Producing)
    고슴맨쉬
    고슴맨쉬
    부수되 집착하지 않고, 이해하되 머무르지 않기

    티스토리툴바