- Promise: Javascript에서 비동기 동작(asynchronous operation)을 간편하게 처리할 수 있도록 도와주는 object
- State: pending -> fullfilled or rejected
 
- Producer vs Consumer
 
 
const promise = new Promise((resolve, reject) => {
  
  console.log('doing something...');
  setTimeout(() => {
    
    reject(new Error('no network'));
  }, 2000);
});
promise
  .then(value => { 
    console.log(value);
  })
  .catch(error => {
    console.log(error); 
  })
  .finally(() => {
    console.log('finally'); 
  });
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)); 
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)
  .catch(error => {
    return '🥖'; 
  })
  .then(cook)
  .then(console.log)