Javascript - async & await

async & await

  • async ์™€ await๋Š” Promise๋ฅผ ๊ฐ„๊ฒฐ/๊ฐ„ํŽธํ•˜๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” API
  • async ์™€ await๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์ถ”๊ฐ€ ๋œ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” Promise ์œ„์— ์กฐ๊ธˆ ๋” ๊ฐ„ํŽธํ•œ API๋ฅผ ์ œ๊ณตํ•จ (syntactic sugar)

1. async

  • async๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ์ž๋™์œผ๋กœ Promise๋กœ ๋ณ€ํ™˜์ด ๋˜์–ด์ง
async function fetchUser() {
  return "hello";
}

fetchUser().then(console.log); //ํ•จ์ˆ˜๋กœ ๋ฐ”๋กœ ํ˜ธ์ถœ(๋ฐ›์•„์˜ค๋Š” ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ ์ƒ๋žต๊ฐ€๋Šฅ)
const user = fetchUser(); //๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์—ฌ ํ˜ธ์ถœ
user.then(console.log);
console.log(user);

2. await

  • await๋Š” async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • error์ฒ˜๋ฆฌ : try / catch ์‚ฌ์šฉ
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function getApple() {
  await delay(1000);
  return "๐ŸŽ";
}

async function getBanana() {
  await delay(1000);
  return "๐ŸŒ";
}

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

pickFruits().then(console.log);

async์™€ await๋ฅผ ์ด์šฉํ•ด์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋“ฏ์ด, ์›๋ž˜ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฆฌํ„ด๊ฐ’๋„ ์ž์—ฐ์Šค๋Ÿฌ์šฐ๋‹ˆ ๋งค์šฐ ๊ฐ„ํŽธํ•˜๋‹ค.

3. await ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ - Promise APIs ์‚ฌ์šฉ

****

  • Array ์™€ ๊ฐ™์ด ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ(iterable) ๊ฐ์ฒด์— ํฌํ•จ๋œ ๋ชจ๋“  ๊ฐ’์„ ๋‹ด์€ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์—ฌ๋Ÿฌ Promise ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
function pickFruits() {
  return Promise.all([getApple(), getBanana()]).then((fruits) =>
    fruits.join(" + ")
  );
}

pickFruits().then(console.log);

getApple์˜ Promise์™€ getBanana์˜ Promise์˜ ๋ฐฐ์—ด์„ ์ „๋‹ฌ๋ฐ›์•„ ๋ฐ›์•„์ง„ ๋ฐฐ์—ด์„ ์ „๋‹ฌ๋ฐ›์•„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ๋‹ค.

****

  • ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋Š” Promise์˜ ๊ฒฐ๊ณผ(ํ˜น์€ ์—๋Ÿฌ)๋ฅผ ๋ฐ˜ํ™˜
unction delay(ms) {
    return new Promise((resolve => setTimeout(resolve, ms)));
}

async function getApple() {
    await delay(2000);
    return '๐ŸŽ';
}

async function getBanana() {
    await delay(1000);
    return '๐ŸŒ';
}

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

pickOnlyOne().then(console.log);

๐ŸŒ๊ฐ€ 1์ดˆ๋งŒ์— ์ „๋‹ฌ๋˜์—ˆ๊ธฐ๋•Œ๋ฌธ์— ๐ŸŒ๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜ : ๋“œ๋ฆผ์ฝ”๋”ฉ by ์—˜๋ฆฌ https://youtu.be/aoQSOZfz3vQ