Promise - 콜백 지옥을 Promise로 바꾸기!

2021. 2. 5. 12:51Front-end/Javascript

728x90
반응형
//Callback Hell example
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 = 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를 통해 간결하고 가독성 좋게 만들 수가 있다.

 

const loginUser =  (id,password) => 
    new Promise((resolve,reject) => {
        setTimeout(()=>{
            if(
                (id === 'ellie' && password === 'dream') ||
                (id === 'coder' && password === 'academy')
            ){
                resolve(id);
            }else{
                reject(new Error('not found'));
            }
        } , 2000);
    })

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

const id = prompt('enter your id');
const password = prompt('enter your password');

loginUser(id,password)
.then(user => getRoles(user))
.then(user => alert(`Hello ${user.name}, you have a ${user.role}.`))
.catch(error => console.log(error));

나는 클래스는 사용하지 않았는데, loginUser와 getRoles를 프로미스를 return하는 메소드로 만들고 두 메소드를 한 클래스 안에 정의해서 만들어도 될 것이다.

 

프로미스를 왜 사용하는지, 프로미스가 얼마나 간단하고 사용하기 좋은지를 깨닫기 위해서는 콜백 지옥을 일단 경험했어야 했는데 너무 가독성도 떨어지고 어려워서 진짜 이 부분에서 포기할 뻔 했는데 꾹 참고 차근차근 해서 한 시련을 극복하고 나니 이해가 되고 기분이 좋다. 이 성취감과 뿌듯함을 잃지 말고 계속 코딩공부해나가는 개발자가 되어야 겠다.

728x90
반응형

'Front-end > Javascript' 카테고리의 다른 글

[Ajax] fetch API - 사용법  (0) 2021.03.19
[Ajax] Ajax란?  (0) 2021.03.19
Promise - Promise Chaining & Error Handling  (0) 2021.02.05
Promise  (0) 2021.02.03
[이벤트] 6. 폼과 이벤트 활용  (0) 2021.01.20