- async와 await은 기존의 promise에서 좀 더 간편한 API를 제공하는 Syntactic sugar라고 할 수 있다. 
 
- Syntactic sugar: 기존에 존재하는 것을 보완하여 좀 더 간편하고 편리하게 쓸 수 있는 것을 말한다. 예) Class, Async & Await
 
function fetchUser() {
  return new Promise((resolve, reject) => {
    
    resolve('promise!');
  });
}
const user = fetchUser();
user.then(console.log);
console.log(user);
async function fetchUser2() {
  return 'async!'
};
const user2 = fetchUser2();
user2.then(console.log);
console.log(user2);
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple() {
  await delay(2000);
  return '🍎';
}
async function getBanana() {
  await delay(1000);
  return '🍌';
}
async function pickFruits() {
  const apple = await getApple();
  const banana = await getBanana();
  return `${apple} + ${banana}`;
}
pickFruits2().then(console.log); 
function pickFruits2() {
  return getApple().then(apple => {
    return getBanana().then(banana => `${apple} + ${banana}`);
  });
}
pickFruits2().then(console.log); 
function pickAllFruits() {
  return Promise.all([getApple(), getBanana()]).then(fruits =>
    fruits.join(' + ')
  );
}
pickAllFruits().then(console.log); 
function pickOnlyOne() {
  return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log);