JS/[드림코딩] 엘리 (완)

12강. Promise

web_seul 2020. 8. 15. 18:08
반응형

'use strict';

 

 Promise  is a JavaScript object for asynchronous operation : 비동기 간편처리obj

1) State: pending -> fulfilled or rejected

2) Producer vs Consumer

 

1.  Producer  _ when new Promise is created, the executor runs automatically.

const promise = new Promise((resolve, reject) => {
    //doing some heavy work(network, read files)
    
    console.log('doing something...');

    setTimeout(()=>{
        //resolve('ellie');
        reject(new Error('no network'));	//error
    },2000);

});

 

2.  Consumer  _ then, catch, finally

promise
    .then((value)=>{ //promise return
        console.log(value);
    })

    .catch((value)=>{
        console.log(error);
    })

    .finally()=>{ //성공,실패에 관계없이 마지막에 호출
        console.log('finally');
    });

 

3. Promise chaining

const fetchNumber = new Promise((resolve, reject)=>{
    setTimeout(()=>resolve(1), 1000);
});



fetchNumber

.then(num => num*2)
.then(num => num*3)
.then(num => {
    return new Promise((resolve,reject)=>{
        setTimeout(() => resolve(num-1),1000);
    });
})

.then(num=> console.log(num));

 

4. Error Handling

const getHen =()=>
    new Promise((resolve, reject)=>{
        setTimeout(()=>resolve('🐓'),1000);
    });

const getEgg = Hen =>
    new Promise((resolve, reject)=>{
        setTimeout(()=>resolve(`${Hen}=>🥚`),1000);
    });

const cook = Egg =>
    new Promise((resolve, reject)=>{
        setTimeout(()=>resolve(`${Egg}=>🍳`),1000);
    });



getHen()
	.then(hen => getEgg(hen))
	.then(egg => cook(egg))
	.then(meal => console.log(meal)); //3초 소요, 🐓=>🥚=>🍳
    
//간략히
getHen() //
	.then(getEgg)
	.then(cook)
	.then(console.log);
//reject

const getHen =()=>
    new Promise((resolve, reject)=>{
        setTimeout(()=>resolve('🐓'),1000);
    });

const getEgg = Hen =>
    new Promise((resolve, reject)=>{
        setTimeout(()=>reject(new Error(`error! ${Hen}=>🥚`)),1000);
    });

const cook = Egg =>
    new Promise((resolve, reject)=>{
        setTimeout(()=>resolve(`${Egg}=>🍳`),1000);
    });

//uncaught

getHen() //
	.then(getEgg)
	.catch(error =>{
	    return '🥖'; //즉시문제해결
	})
	.then(cook)
	.then(console.log)
	.catch(console.log);    // 🥖=>🍳

 

Callback Hell example

// 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)}
// );

↓

class UserStorage{
    loginUser(id,password){
        return new Promise((resolve, reject)=>{   

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

    getRoles(user){
        return new Promise((resolve, reject)=>{
            setTimeout(()=>{
                if(user === 'ellie'){
                    resolve({name:'ellie', role:'admin'});
                }else{
                    reject(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)
    .then(UserStorage.getRoles)
    .then(user => alert(`Hello ${user.name}, you have a ${user.role} role`))
    .catch(console.log);

 

반응형

'JS > [드림코딩] 엘리 (완)' 카테고리의 다른 글

13강. async, await, promise APIs  (0) 2020.08.24
11강. Callback  (0) 2020.07.21
10강. JSON  (0) 2020.07.20
09강. Array APIs  (0) 2020.07.20
08강. Array  (0) 2020.07.11