์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ Async-Await

@choi2021 ยท December 02, 2022 ยท 11 min read

๐Ÿ’Ž ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ Async-Await

EO ์ฑ„๋„์˜ ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์˜ ์ด๋ ฅ์„œ ๊ด€๋ จ ํŒ์„ ๋ง์”€ํ•ด ์ฃผ์‹œ๋Š” ์˜์ƒ์„ ๋ณธ ์ ์ด ์žˆ๋‹ค. ๊ทธ๋•Œ ํ•œ ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋ถ„๊ป˜์„œ "skill๋ž€์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž˜ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด์„œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฌผ์–ด๋ณด๋ฉด ์ œ๋Œ€๋กœ ์„ค๋ช… ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ์„ ์žˆ๋‹ค"๋ผ๊ณ  ๋ง์”€ํ•˜์…จ๋‹ค. ๊ทธ ๋ง์”€์— "์ œ๋„ˆ๋ ˆ์ดํ„ฐ? ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€"๋ผ๊ณ  ๋‚˜๋Š” ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์™œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•œ ์ง€, ์–ด๋–ป๊ฒŒ ์“ฐ์ด๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋ณด๋‹ˆ ๋‚˜๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋ชฐ๋ž๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด์ œ๋Š” ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐ŸŽˆ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” "์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด"๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ธ์ง€ ๋จผ์ € ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด

์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด (iterable object)๋Š” ์ด์ „์— iteration์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ์ ์ด ์žˆ์ง€๋งŒ, ์•„์ง ์™„์ „ํžˆ ๋ฐ›์•„ ๋“ค์—ฌ์ง€์ง€ ์•Š์•„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ ๋‘ ๊ฐ€์ง€๋ฅผ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

๋จผ์ € ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์€ ์œ„ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ์˜ ์กฐ๊ฑด์œผ๋กœ ๊ฐ์ฒด ๋‚ด์˜ [Symbol.iterator]๋ฅผ ํ‚ค๋กœ ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ [Symbol.iterator] ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด next๋ฅผ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด์—ฌ์•ผํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. next๋ฉ”์†Œ๋“œ๋Š” ์ˆœํšŒํ•˜๋ฉฐ value,done ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋Š” for-of๋กœ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํŠน์ง•์„ ๊ฐ€์ง€๋ฉฐ, ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ๋ฐฐ์—ด์ด ์žˆ๋‹ค.

const fibonacci = {
  [Symbol.iterator]() {
    let [pre, cur] = [0, 1]
    const max = 10
    return {
      next() {
        ;[pre, cur] = [cur, pre + cur]
        return { value: cur, done: cur >= max }
      },
    }
  },
}

for (const num of fibonacci) {
  console.log(num)
}

์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

์œ„์˜ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์„ ์–ธ์‹œ, function* ๋กœ ์‹œ์ž‘ํ•˜๊ณ  yield ๋ฌธ์„ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•œ๋‹ค. yield๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด์˜ next ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์‹คํ–‰์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์•ž์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด fibonacci๋ฅผ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

const fibonacciGen = (function* () {
  let [pre, cur] = [0, 1]
  const max = 10
  while (pre + cur <= max) {
    ;[pre, cur] = [cur, pre + cur]
    yield cur
  }
})()

for (const num of fibonacciGen) {
  console.log(num)
}

์ด์ œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ "์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์‹คํ–‰์„ ์ œ์–ดํ•˜๋Š”์ง€" ๋‘ ๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ์•Œ์•„๋ณด์ž. ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด generator๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“  ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›๋Š”๋‹ค. next ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด value,done์„ key๋กœ ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ next๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค "yield๋ฌธ๊นŒ์ง€ ์ง„ํ–‰๋˜๊ณ  ๋ฉˆ์ถ˜๋‹ค๋Š” ์ "์ด๋‹ค. yield๋ฌธ์ด ๋” ์ด์ƒ ์—†์„ ๋•Œ๋Š” value๋กœ undefined, done์€ true๋กœ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

function* genFunc() {
  try {
    yield 1
    yield 2
    yield 3
  } catch (e) {
    console.error(e)
  }
}

const generator = genFunc()
console.log(generator.next()) // { value: 1, done: false }
console.log(generator.next()) // { value: 2, done: false }
console.log(generator.next()) // { value: 3, done: false }
console.log(generator.next()) // { value: undefined, done: true }

๋‘๋ฒˆ์งธ ์˜ˆ์ œ๋Š” yield๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ํ• ๋‹นํ•œ ์˜ˆ์ œ๋‹ค. ์‹คํ–‰ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. res ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ: yield 1๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ณ  ์ง„ํ–‰์„ ๋ฉˆ์ถ˜๋‹ค. { value:1, done:false }๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. res ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ: next(10)์œผ๋กœ ์ „๋‹ฌ ๋ฐ›์€ 10์„ x์— ํ• ๋‹นํ•˜๊ณ , x+10๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค. { value: 20, done: false }๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. res ์„ธ ๋ฒˆ์งธ ํ˜ธ์ถœ: next(20)์œผ๋กœ ์ „๋‹ฌ ๋ฐ›์€ 20์„ y์— ํ• ๋‹นํ•˜๊ณ , { value: 30, done: true }๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function* genFunc() {
  const x = yield 1
  console.log("x", x) // x 10
  const y = yield x + 10
  console.log("y", y) // y 20
  return x + y
}

const generator = genFunc(0)

let res = generator.next()
console.log(res) // { value: 1, done: false }
res = generator.next(10)
console.log(res) // { value: 20, done: false }
res = generator.next(20)
console.log(res) // { value: 30, done: true }
console.log(generator.next()) // { value: undefined, done: true }

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์‹คํ–‰์„ ์ œ์–ดํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์–ด๋””์— ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

๐Ÿงจ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ํ™œ์šฉ: Async-Await

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์‚ฌ์‹ค ์ด๋ฏธ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋ฐ”๋กœ async- await ๊ตฌ๋ฌธ์ด๋‹ค. async-await์€ ๋จผ์ € ์ •๋ฆฌํ–ˆ๋˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ€๋Šฅํ–ˆ๋˜ ๊ฒƒ์€ async-await์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ async-await์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€์ง€๋Š” ํŠน์ง•, next์™€ yield๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž์™€ ํ•จ์ˆ˜์˜ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ ์„ ์ด์šฉํ–ˆ๋‹ค. ํ•จ์ˆ˜ ๋™์ž‘์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. asyncํ•จ์ˆ˜๋Š” ์ „๋‹ฌ ๋ฐ›์€ generatorํ•จ์ˆ˜๋กœ ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•œ ํ›„์—, generator์˜ next์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ € ํ•จ์ˆ˜ onResolved๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ, ๋ฐ˜ํ™˜๋œ onResolved๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฒซ๋ฒˆ์งธ yield๋ฌธ์˜ fetch(url)์„ ์ง„ํ–‰ํ•ด result๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.
  3. ์•„์ง fetchTodoํ•จ์ˆ˜์˜ ๋๊นŒ์ง€ ์ง„ํ–‰๋˜์ง€ ์•Š์•„ result์˜ done์ด false์ด๋ฏ€๋กœ ๋‹ค์‹œ onResolved๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  4. ๋‘ ๋ฒˆ์งธ onResolved์‹คํ–‰์œผ๋กœ fetchTodo์˜ response๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ yield๋ฌธ์˜ response.json()์„ ์ง„ํ–‰ํ•ด result๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.
  5. ์•„์ง fetchTodoํ•จ์ˆ˜์˜ ๋๊นŒ์ง€ ์ง„ํ–‰๋˜์ง€ ์•Š์•„ result์˜ done์ด false์ด๋ฏ€๋กœ ๋‹ค์‹œ onResolved๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  6. ์„ธ ๋ฒˆ์งธ onResolved์‹คํ–‰์œผ๋กœ fetchTodo์˜ todo๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  console์— ํ˜ธ์ถœํ•œ ๋’ค์— result๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.
  7. fetchTodo๊ฐ€ ๋๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— result.done์€ true๊ฐ€๋˜์–ด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ข…๋ฃŒํ•œ๋‹ค.
const async = generatorFunc => {
  const generator = generatorFunc()
  const onResolved = arg => {
    const result = generator.next(arg)
    return result.done
      ? result.value
      : result.value.then(res => onResolved(res))
  }
  return onResolved
}

async(function* fetchTodo() {
  const url = "https://jsonplaceholder.typicode.com/todos/1"
  const response = yield fetch(url)
  const todo = yield response.json()
  console.log(todo)
})()

Async- Await

async,await์€ ์œ„์˜ ์˜ˆ์ œ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ฒŒ ์ด์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•์œผ๋กœ ๋น„๋™๊ธฐ ๋กœ์ง์„ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋„์™€์ค€๋‹ค. ์ฃผ์˜ํ•  ์ ์€ ํ•ญ์ƒ ๋ฐ˜ํ™˜๊ฐ’์€ Promise๋ผ๋Š” ์ ์ด๋‹ค. Typescript๋กœ ์ž‘์—…ํ•˜๋ฉด์„œ async-await์„ ์ด์šฉํ•˜๋ฉด ๋™๊ธฐ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ์ž˜๋ชป ํƒ€์ž…์„ ์ „๋‹ฌํ•ด ์ค€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. async- await์˜ ์žฅ์ ์€ promise chaining์—์„œ then,catch,finally๋กœ ์—ฐ๊ฒฐํ•˜๋‹ค ๋ณด๋ฉด callback hell์ฒ˜๋Ÿผ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋  ์ˆ˜ ์žˆ์„ ๋•Œ, ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์œผ๋กœ ๋™๊ธฐ์  ์ฝ”๋“œ์ฒ˜๋Ÿผ try-catch๊ตฌ๋ฌธ์œผ๋กœ ์—๋Ÿฌํ•ธ๋“ค๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋ฅผ ์‹ค์ œ async-await์œผ๋กœ ๊ณ ์ณ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

async function fetchTodo() {
  const url = "https://jsonplaceholder.typicode.com/todos/1"
  const response = await fetch(url)
  const todo = await response.json()
  console.log(todo)
}

await์€ promise๊ฐ€ settled๋œ ์ƒํƒœ(์„ฑ๊ณต,์‹คํŒจ์™€ ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ์ƒํƒœ)๊ฐ€ ๋์„ ๋•Œ resolveํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ด€๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ promise๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ ๋ชจ๋‘ await์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ์„ ๊ฐ–๋Š”๋‹ค. ์•ž์„œ ์ •๋ฆฌํ•œ Promise.all์„ ์ด์šฉํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ํ•œ๋ฒˆ๋งŒ await ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐ๊ฐ€๋Šฅํ•˜๋‹ค.

//์ˆ˜์ • ์ „
async function foo() {
  const a = await new Promise(resolve => setTimeout(() => resolve(1), 3000))
  const b = await new Promise(resolve => setTimeout(() => resolve(2), 2000))
  const c = await new Promise(resolve => setTimeout(() => resolve(3), 1000))
  console.log([a, b, c])
}

foo() // 6์ดˆ ๋’ค [1,2,3]

async function foo() {
  const res = await Promise.all([
    new Promise(resolve => setTimeout(() => resolve(1), 3000)),
    new Promise(resolve => setTimeout(() => resolve(2), 2000)),
    new Promise(resolve => setTimeout(() => resolve(3), 1000)),
  ])
  console.log(res)
}

foo() // 3์ดˆ ๋’ค [1,2,3]

[์ฐธ๊ณ ]

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋”ฅ๋‹ค์ด๋ธŒ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ async/await

@choi2021
๋งค์ผ์˜ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐœ๋ฐœ์ผ์ง€์ž…๋‹ˆ๋‹ค.