JavaScript

promise

김꼬알 2023. 6. 23. 17:11

Promise

  • Promise is a JavaScript object for asynchronous operation
  • State: pending → fullfilled or rejected
  • Producer 와 Consumer 의 구분

 

1. Producer

  • promise 만들기
// when new Promise is created, the executor runs automatically

const promise = new Promise((resolve, reject) => {    // 정상적으로 작동하면 resolve, 아니면 reject 수행
  // doing some heavy work(network, read files)
  setTimeout(() => {
    resolve('ellie');
    reject(new Error('no network'));
  }, 2000;
});

 

2. Consumers: then, catch, finally

  • promise 사용하기
promise
.then(value => {
  console.log(value);
})    // resolve 일 때 2초 뒤에 ellie 출력
.catch(error => {
  console.log(error);
});    // reject 일 때 Error: no network 출력
.finally(() => {
  console.log('finally')        // 성공, 실패와 상관없이 마지막에 실행됨
  });    // 마지막에 finally 출력

 

3. Promise chaining

  • promise 연결하기
const fetchNumber = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
});

fetchNumber
.then(num => num * 2)    // 2
.then(num => num * 3)    // 6
.then(num => {    // 6
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(num - 1), 1000);    // 6 - 1
  });
})
.then(num => console.log(num));    // 2초 뒤에 5 출력

 

4. Error Handling

const getHen = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve('chicken'), 1000);
  });
const getEgg = hen =>
  new Promise((resolve, reject) => {
    setTimeout(() => reject(new Error(`error! ${hen} => egg`), 1000);
  });
const cook = egg =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${egg} => fried egg`), 1000);
  });

getHen()
.then(hen => getEgg(hen))    // .then(getEgg)로 작성 가능
.catch(error => {    // catch로 에러를 잡아줬기 때문에 에러가 나지 않고 빵으로 대체해서 출력됨
  return 'bread';
})    // bread => fried egg
.then(egg => cook(egg))
.then(meal => console.log(meal))    // chicken => egg => fried egg 
.catch(console.log);    // error! chicken => agg

 

5. Callback to promise 로 수정하기

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, 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)
.then(userStorage.getRoles)
.then(user => alert(`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`)
.catch(console.log(error));

 

'JavaScript' 카테고리의 다른 글

event, event handler  (0) 2023.06.29
async & await  (0) 2023.06.26
callback  (0) 2023.06.22
function  (0) 2023.06.13
JSON  (1) 2023.06.13