μλ°μ€ν¬λ¦½νΈ μΈμ΄λ λκΈ°μ μΈμ΄μ΄λ€.
λκΈ°μ μΈμ΄λ μμμ λΆν° μλλ‘ μμ°¨μ μΌλ‘ μ½λκ° μ§νλλ κ²μ λ§νλ€.
κ·ΈλΌ λΉλκΈ°μ μΈμ΄λ 무μμΌκΉ?
μ΄λ€ μμ
μ μμ²νλ©΄ κ·Έ μμ
μ΄ μ’
λ£λ λκΉμ§ κΈ°λ€λ¦¬κ³ κ·Έ λ€μ μμ
μ νλ κ²μ΄ μλλΌ, μ¬λ¬ μμ
μ λμμ νλ κ²μ λ§νλ€.
ν¨μμ 맀κ°λ³μλ₯Ό ν΅ν΄ λ€λ₯Έ ν¨μμ λ΄λΆλ‘ μ λ¬λλ ν¨μ.
μ΄λ€ μ΄λ²€νΈμ μν΄ νΈμΆλμ΄μ§λ ν¨μ.
λμ€μ νΈμΆλλ ν¨μ.
λνμ μΈ μ½λ°±ν¨μλ‘λ setTimeout μ΄ μλ€.
console.log('1'); setTimeout(()=> console.log('2'); , 1000) //1μ΄ νμ 2μΆλ ₯ console.log('3'); // 1,3,2
μ½λ°±ν¨μλ λκΈ°μ μΌλ‘ μ¬μ©ν μ μλ€.
function printImmediately (print) { print(); } printImmediately(()=> console.log('hello')); // hello
printλΌλ μ½λ°±μ λ°μμ printλ₯Ό λ°λ‘ μ€ννλ€.
function printImmediately (print) { print(); } function printWithDelay (print, timeout) { setTimeout(print, timeout); } console.log('1'); setTimeout(()=>console.log('2'), 1000); console.log('3'); printImmediately(()=> console.log('hello')); printWithDelay(()=> console.log('async callback'),2000); // 1 , 3 , hello , 2 μμλλ‘ μΆλ ₯λλ€.
μ νλΈ λλ¦Όμ½λ©μμ κ°λ¨ν μ½λ°±μ§μ₯μ λ§λ€μ΄λ³΄μλ€. μ½λλ₯Ό 보며 μ½λ°±μ§μ₯μ΄ λμ§ μ΄ν΄ν΄λ³΄μ!π§
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, // μ
λ ₯λ°μ μμ΄λμ ν¨μ€μλλ₯Ό loginUserμΌλ‘ μ λ¬νμ¬ λ‘κ·ΈμΈμ΄ λμλ€λ©΄
password,
(user)=>{ /// μ±κ³΅νλ€λ©΄ μ¬μ©μμ μν νμΈ
UserStorage.getRoles(
user,
userWithRole => {
alert(
`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`
);
},
error => { // μ¬μ©μμ μν μ λ°μμ€μ§ λͺ»νμ λ
console.log(error);
}
);
},
error => { // λ‘κ·ΈμΈμ νμ§ λͺ»νμ λ
console.log(error);
}
)
μ΄λ κ² μ½λ°±ν¨μ μμμ μ½λ°±ν¨μλ₯Ό νΈμΆνκ³ , λ κ·Έ ν¨μμμ μ½λ°±ν¨μλ₯Ό νΈμΆνλ κ²μ μ½λ°±μ§μ₯μ΄λΌκ³ νλ€.
μ§κΈμ μ½λκ° μ§§μ νΈμ΄μ§λ§, λ§μ½ μ€μ νμ μμ μ΄λ κ² μ½λ°±ν¨μλ₯Ό μ¬μ©νλ€λ©΄, κ°λ μ±μ΄ μ’μ§ μκ³ , λΉμ§λμ€ λ‘μ§μ νμ νκΈ° μ΄λ ΅κ³ , λλ²κΉ , μλ¬ μ²λ¦¬κ° μ΄λ ΅λ€. λ, μ μ§λ³΄μκ° μ΄λ ΅λ€λ λ¨μ μ΄ μλ€.
μΆμμ μΌλ‘ μ€λͺ
νμλ©΄, λ§μ½ μμ§ μΆμλμ§ μμ μμ
μ Aμ¬μ©μκ° λ―Έλ¦¬ μ΄λ©μΌμ λ±λ‘νμ¬ μμ
μΆμλλ λ μ΄λ©μΌλ‘ μ μ‘λ μ μκ² μμ½μ ν ν (promise λ±λ‘), μμ
μ΄ μΆμλ λ Aμ¬μ©μμκ² μ΄λ©μΌμ΄ μ μ‘λλ€.(Promiseκ° μ±κ³΅μ μΌλ‘ κ° μ λ¬)
μμ
μ΄ μΆμλ ν Bμ¬μ©μκ° μ΄λ©μΌ λ±λ‘λ²νΌμ λλ₯΄λ©΄, μ΄λ―Έ μΆμλ νμ΄κΈ°μ κΈ°λ€λ¦΄ νμμμ΄ μ΄λ©μΌμ΄ λ°λ‘ μ μ‘λλ€.(μ΄λ―Έ μ±κ³΅μ μΌλ‘ μ²λ¦¬λ Promise)
μ½κ² λ§ν΄, λΉλκΈ°λ₯Ό ꡬνν λ μ¬μ©λλ κ°μ²΄μ΄λ€.
νλ‘λ―Έμ€λ μνμ 보λ₯Ό κ°μ§λλ°,
panding(λΉλκΈ° μ²λ¦¬κ° μμ§ μνλμ§ μμ μν = νλ‘λ―Έμ€κ° μμ±λ μ§ν κΈ°λ³Έ μν),
fulfilled(λΉλκΈ° μ²λ¦¬κ° μνλ μν(μ±κ³΅)= resolve ν¨μ νΈμΆ),
rejected(λΉλκΈ° μ²λ¦¬κ° μνλ μν(μ€ν¨)= reject ν¨μ νΈμΆ),
seletted(λΉλκΈ° μ²λ¦¬ μ±κ³΅,μ€ν¨μ μκ΄μμ΄ λΉλκΈ° μ²λ¦¬κ° μνλ μν) κ° μλ€.
Promise μμ±μ ν¨μλ₯Ό new μ°μ°μμ ν¨κ» νΈμΆνλ©΄, Promise κ°μ²΄λ₯Ό μμ±νλ€. λΉλκΈ° μ²λ¦¬λ₯Ό μνν μ½λ°±ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ°, μ΄ μ½λ°±ν¨μλ resolve μ reject ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€. μΈμλ‘ μ λ¬λ°μ μ½λ°± ν¨μ λ΄λΆμμ λΉλκΈ° μ²λ¦¬λ₯Ό μννκ³ , λ§μ½ λΉλκΈ° μ²λ¦¬λ₯Ό μ±κ³΅νλ©΄ resolve ν¨μλ₯Ό, λ§μ½ μ€ν¨νλ©΄ reject ν¨μλ₯Ό νΈμΆνλ€.
const promise = new Promise((resolve, reject) => { if (/*λΉλκΈ° μ²λ¦¬ μ±κ³΅*/) { resolve('result'); } else {/*λΉλκΈ° μ²λ¦¬ μ€ν¨*/ reject('error'); } });
λ§λ€μ΄μ§ νλ‘λ―Έμ€ κ°μ²΄ μ¬μ©. then , catch , finally μ΄ μλ€.
then λ©μλλ λΉλκΈ° μ²λ¦¬κ° μ±κ³΅νμ λ νΈμΆλλ μ½λ°±ν¨μ(resolve),
λΉλκΈ° μ²λ¦¬κ° μ€ν¨νμ λ νΈμΆλλ μ½λ°±ν¨μ(reject) μ΄ λ κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
νλ‘λ―Έμ€κ° rejected μνμΈ κ²½μ°μλ§ νΈμΆλλ€.
νλ‘λ―Έμ€μ μ±κ³΅, μ€ν¨μ μκ΄μμ΄ λ¬΄μ‘°κ±΄ νλ² νΈμΆλλ€.
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); }); getHen() .then(getEgg) .then(cook) .catch(console.log) .then(console.log)
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 ${userWithRole.name}, you have a ${userWithRole.role} role` )) .cathch(console.log);
μ΄λ κ² ν΄κ²°ν μ μλ€! λ§μ΄ μ§μ ꡬννλ©΄μ μ΅νλκ°μΌ ν κ² κ°λ€!πͺ
λλ¦Όμ½λ© κ°μλ₯Ό λ£κ³ μμ±νμμ΅λλ€.