javascript-012 - 비동기의 꽃 Javascript async 와 await

1 분 소요

async & await

promise then 이어진 코드는 가독성이 다소 떨어짐

async 와 await 는 더 사용을 편리하게 하기 위한 syntactic sugar (ex. class)

async

function fetchUser() {
  // do network request in 10 secs...
  return 'ellie';
}

function user = fetchuser();
console.log(user)

프로미스로 처리

function fetchUser() {
  return new Promise((resolve, reject) => {
    // do network request in 10 secs...
    resolve('ellie');
  });
}

const user = fetchUser();
user.then(console.log(user));
console.log(user);

async await 적용

async function fetchUser() {
  // do network request in 10 secs...
    resolve('ellie');
  });
}

const user = fetchUser();
user.then(console.log);
console.log(user);

await

function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple() {
  await delay(3000);
  return 'Apple';
}

async function getBanana() {
  await delay(3000);
  return 'Banana';
}

// Promise
function pickFruits() {
  return getApple().then(apple => {
    .then(banana => `${apple} + ${banana}`);
  });
}

// async await
async function pickFruits() {
  const apple = await getApple();
  const banana = await getBanana();
  return `${apple} + ${banana}`;
}

pickFruits().then(console.log);

await 병렬 처리

위 케이스는 getApple, getBanana 를 병렬로 처리할 수 있음 await 는 각 데이터를 동시에 가져올 수도 있음

// await 병렬로 처리
async function pickFruits() {
  const applePromise = getApple();
  const bananaPromise = getBanana();
  const apple = await applePromise;
  const banana = await bananaPromise;
  return `${apple} + ${banana}`;
}

pickFruits().then(console.log);

유용한 Promise APIs

Promise.all

function pickAllFruits() {
  return Promise.all([getApple(), getBanana()])
    .then(fruits => fruits.join(' + '));
}

pickAllFruits().then(console.log);

Promise.race

function pickOnlyOne() {
  return Promise.race([getApple(), getBanana()]);
}

pickOnlyOne().then(console.log);

참고

  • [https://youtu.be/JB_yU6Oe2eE