๐Ÿค™๐ŸปPromise Part(5) async, await, Promise.all(), Promise.race()

๐Ÿค™๐ŸปSyntactic Sugar

async, await ์€ Promise ๋ฅผ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” Syntatic Sugar ์ด๋‹ค.

๊ธฐ์กด์— ์กด์žฌํ–ˆ๋˜ Promise ๋ฅผ ๊ฐ์‹ธ์„œ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ,

ํ”„๋กœ๋ฏธ์Šค์™€ .then ์œผ๋กœ ์ด์–ด์ง€๋Š” ๋˜๋‹ค๋ฅธ Promise Hell ์„ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๊ธฐ๋„ ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌด์กฐ๊ฑด async, await ์œผ๋กœ๋งŒ promise ๋ฅผ ๋Œ€์ฒดํ•ด์„œ ์‚ฌ์šฉํ•ด๋ผ ๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋‹ค.

์ž˜์€ ๋ชจ๋ฅด์ง€๋งŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ promise ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ํ˜น์€ async, await ์„ ์“ฐ๋Š” ๊ฒƒ์ด๋ผ ํ•œ๋‹ค.

๐Ÿ˜˜๋‹ค์‹œ, ์ด๊ฑธ ์™œ ์“ฐ๋Š”๋ฐ?

์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ (์„œ๋ฒ„) ์—์„œ ๋ฐ›์•„์˜ค๋Š” ์—ญํ• ์„ ํ•˜๋Š” fetchUser ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ฝ”๋“œ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ๋Œ€๋žต 10์ดˆ ์ •๋„ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.

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

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

์˜ค์˜ค๋ž˜.. ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ผ ๊ฐ€์ •ํ–ˆ๋‹ค.

์ด๋ ‡๋“ฏ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋” ํ•ด์ฃผ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์ „ํ˜€ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, Javascript Engine ์€ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

ํ•œ ์ค„ ํ•œ ์ค„์ด ๋๋‚˜์•ผ ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋™๊ธฐ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

fetchUser() ๋‚ด์—์„œ 10์ดˆ๊ฐ„ ๋จธ๋ฌด๋ฅด๊ณ  ์žˆ๋‹ค๊ฐ€ ๊ทธ์ œ์„œ์•ผ โ€˜GangGunmaโ€™ ๊ฐ€ ๋ฆฌํ„ด์ด ๋œ๋‹ค.

๊ทธ์ œ์„œ์•ผ ๋ฆฌํ„ด๋œ ๊ฐ’์„ ๋ฐ›์•„ ํ™”๋ฉด์— ์ฐํžˆ๊ฒŒ ํ•œ๋‹ค.

๋งŒ์•ฝ ์œ„์˜ ์ฝ”๋“œ ๋‹ค์Œ์— Web ํ™”๋ฉด์˜ UI ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์›น ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๋Š” 10์ดˆ ๋™์•ˆ ํ……ํ…… ๋น„์–ด์žˆ๋Š” ํ™”๋ฉด์„ ๋ด์•ผ๋งŒ ํ•  ๊ฒƒ์ด๋‹ค.

๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ, ์ผ๋“ค์„ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค!

์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด๋‹ค! (๋ˆˆ๊ฐ๊ณ ๋„์“ธ์ˆ˜์žˆ๋‹ค)

function fetchUser() {
  return new Promise((resolve, reject) => {
    resolve('GangGunma')
  })
}

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป๋‹ค์‹œ, Promise ์˜ ์ •์˜

โ€œ๋‚ด๊ฐ€ ์–ธ์ œ user ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ด Promise ๋ผ๋Š” Object ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ ๋„ค๊ฐ€ then ์ด๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋งŒ ๋“ฑ๋กํ•ด ๋†“์œผ๋ฉด

user ์˜ data ๊ฐ€ ์ค€๋น„๋˜๋Š” ๋Œ€๋กœ ๋„ค๊ฐ€ ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‚ด๊ฐ€ ๋ถˆ๋Ÿฌ์ฃผ๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ• ๊ฒŒ!โ€

function fetchUser() {
  return new Promise((resolve, reject) => {
    return 'GangGunma';
  })
}

fetchUser()
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "pending"
[[PromiseResult]]: undefined

new Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜์ง€๋งŒ resolve ๋‚˜ reject ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๊ธฐ์—

๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ ๋ณด๋“ฏ์ด state ๊ฐ€ ๊ณ„์† pending ์ƒํƒœ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ผญ Promise ์•ˆ์—๋Š” resolve ๋‚˜ reject ๋ฅผ ์ด์šฉํ•ด ์™„๋ฃŒ๋ฅผ ์ง€์–ด์ค˜์•ผ ํ•œ๋‹ค.

function fetchUser() {
  return new Promise((resolve, reject) => {
    resolve('GangGunma');
  })
}

fetchUser()
Promise {<fulfilled>: "GangGunma"}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "GangGunma"

์ด์ œ Promise ์ƒํƒœ๊ฐ€ ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ fulfilled ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด์„œ PromiseResult ๊ฐ€ GangGunma ๋กœ ๋ฐ”๋€ ๊ฑธ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋งŒ๋“ค์–ด๋†“์€ Producer ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก consumer ๋ฅผ ์„ค์ •ํ•ด ๋ณด๋ฉด,

const user = fetchUser();
user.then(console.log)
GangGunma
Promise {<fulfilled>: undefined}

.then ์ด๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„์—์„œ ๊ฐ’์„ ์–ป์–ด์™”๋‹ค. ์ข‹์•„์ข‹์•„ ๋งˆ์Œ์— ๋“ ๋‹ค.

๐ŸŒˆasync ๋ฐ”๋ฅด๊ธฐ

function fetchUser() {
  return new Promise((resolve, reject) => {
    resolve('GangGunma')
  })
}

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

์œ„์™€ ๊ฐ™์ด Promise ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ด ๋ธ”๋กœ๊ทธ์˜ ์ฃผ์ œ ์ค‘ ์ฒซ๋ฒˆ์งธ์ธ async ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ์‹œ๊ฐ„์ด๋‹ค.

async function fetchUser() {
    return 'GangGunma';
}

fetchUser()
Promise {<fulfilled>: "GangGunma"}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "GangGunma"

function ์•ž์— async ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋งŒ์„ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ์•ž์„œ ๋งŒ๋“ค์—ˆ๋˜ Promise Producer ์™€ ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋˜‘๊ฐ™์ด fetchUser ๊ฐ€ Promise ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

async ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋งŒ์œผ๋กœ ์ฝ”๋“œ๋ธ”๋Ÿญ์ด ์ž๋™์œผ๋กœ Promise ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋Š”๊ตฌ๋‚˜!

๊ทธ ๊ฒฐ๊ณผ resolve, reject, new Promise ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์“ฐ๋“ฏ ๋ฐ”๋กœ return ํ•ด ์ฃผ์–ด๋„ ๋˜๋Š”๊ตฌ๋‚˜!

๐ŸŽawait ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋Š” ๊ณผ์ผ์–ป๊ธฐ๐ŸŒ

์ผ์ • ์‹œ๊ฐ„(ms) ์ด ์ง€๋‚˜๋ฉด resolve ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๋Š” ์ง€์—ฐ ํ•จ์ˆ˜์ด๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ์‚ฌ๊ณผ์™€ ๋ฐ”๋‚˜๋‚˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” Promise ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์œ„์˜ ์ง€์—ฐ ํ•จ์ˆ˜ delay(ms) ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ณผ์ผ์„ ๋”ฐ๋Š” ์‹œ๊ฐ„์„ ๋”œ๋ ˆ์ด ์‹œ์ผœ ์ค„๊ฑด๋ฐ,

๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ await ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

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

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

await ๋Š” delay(3000) ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค ์ค€๋‹ค.

์ฆ‰, 3์ดˆ ์žˆ๋‹ค๊ฐ€ โ€˜์‚ฌ๊ณผโ€™ ํ˜น์€ โ€˜๋ฐ”๋‚˜๋‚˜โ€™ ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” Promise ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์‚ฌ์‹ค ์œ„์˜ ์ฝ”๋“œ๊ฐ€ async, await ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

function getBanana() {
  return delay(3000).then(() => '๐ŸŒ')
}

์œ„์˜ ์ฝ”๋“œ ๋ณด๋‹ค๋Š” ์–ด์ฉŒ๋ฉด async, await ํ‚ค์›Œ๋“œ๋ฅผ ์จ์„œ delay ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ banana ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด,

๋™๊ธฐ์ ์ธ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ด์„œ ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์•„ ๋ณด์ด๊ธฐ๋„ ํ•œ๋‹ค.

์ด์ œ ๋ชจ๋“  ๋‚˜๋ฌด์—์„œ ๊ณผ์ผ์„ ์‹น์“ธ์ด ํ•ด๋ณด์ž.

๐ŸŽpickFruits() ๋กœ ๊ณผ์ผ ๋‹ค ๋”ฐ์˜ค๊ธฐ๐ŸŒ(1) - Promise Hell Begins

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

pickFruits().then(console.log)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "pending"
[[PromiseResult]]: undefined
๐ŸŽ + ๐ŸŒ

์ •ํ™•ํžˆ 6์ดˆ ๋’ค์— (์‚ฌ๊ณผ 3์ดˆ, ๋ฐ”๋‚˜๋‚˜ 3์ดˆ) ๐ŸŽ + ๐ŸŒ ๋กœ ๋ชจ๋“  ๋‚˜๋ฌด์—์„œ ๊ณผ์ผ์„ ๋”ฐ ์™”๋‹ค. (๋ฐ”๋‚˜๋‚˜๊ฐ€ ๋‚˜๋ฌด์˜€๋˜๊ฐ€?)

ํ•˜์ง€๋งŒ ์ฝœ๋ฐฑ ์ง€์˜ฅ์— ์ด์€ ํ”„๋กœ๋ฏธ์Šค ํ—ฌ ์ง€์˜ฅ์˜ ์‹œ์ž‘์ด๋‹ค. ๋‚˜๋ฌด๊ฐ€ ๋” ์ƒ๊ธด๋‹ค๋ฉด ๋”์šฑ ์‹ฌํ•œ ์ค‘์ฒฉ์ ์ธ ์ฒด์ด๋‹์ด ์ด์–ด์งˆ ๊ฒƒ์ด๋‹ค.

๐ŸŽpickFruits() ๋กœ ๊ณผ์ผ ๋‹ค ๋”ฐ์˜ค๊ธฐ๐ŸŒ(2) - async, await ํ‚ค์›Œ๋“œ ์จ๋ณด๊ธฐ!

async function pickFruits() {
  const apple = await getApple();
  const banana = await getBanana();
  return `async ์™€ await ์„ ์‚ฌ์šฉํ•œ ๊ณผ์ผ ๋”ฐ๊ธฐ -> ${apple} + ${banana}`;
}

pickFruits().then(console.log)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined

async ์™€ await ์„ ์‚ฌ์šฉํ•œ ๊ณผ์ผ ๋”ฐ๊ธฐ -> ๐ŸŽ + ๐ŸŒ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 6์ดˆ ๋’ค์— ์‚ฌ๊ณผ์™€ ๋ฐ”๋‚˜๋‚˜๋ฅผ ๋”ฐ์™”๋‹ค.

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

๋งŒ์•ฝ async function getApple() ์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์— throw โ€˜errorโ€™ ๊ฐ€ ์žˆ๋‹ค๋ฉด,

async function pickFruits() {
  try {
    const apple = await getApple();
    const banana = await getBanana();
  } catch() {
    // ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ž‘์„ฑ.
  }
  return `async ์™€ await ์„ ์‚ฌ์šฉํ•œ ๊ณผ์ผ ๋”ฐ๊ธฐ -> ${apple} + ${banana}`;
}

try, catch ๋ฅผ ํ†ตํ•ด ์ž‘์„ฑํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์•„๋‹ˆ ๊ทผ๋ฐ ์‚ฌ๊ณผ ๋”ฐ๋Š”๊ฑฐ 3์ดˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋ฐ”๋‚˜๋‚˜ ๋”ฐ๋Š”๊ฑฐ 3์ดˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๊ผญ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ๋ผ?

์‚ฌ๊ณผ๋ž‘ ๋ฐ”๋‚˜๋‚˜ ๋”ฐ๋Š” ๊ฒŒ ๋จผ ์ƒ๊ด€์ด๋ผ๊ณ โ€ฆ 6์ดˆ ๊ฑธ๋ฆฌ๊ฒŒ ํ•˜๋Š”๊ฑด ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ด์ง€ ์•Š๋‚˜?

๐ŸŽ๐ŸŒ await ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ

์‚ฌ๊ณผ ๋”ฐ๋Š”๋ฐ 3์ดˆ, ๋ฐ”๋‚˜๋‚˜๋ฅผ ๋”ฐ๋Š”๋ฐ 3์ดˆ..

์ด๋Ÿฌํ•œ ์ˆœ์ฐจ ์ง„ํ–‰์€ ๋น„ํšจ์œจ ๊ฐ™๋‹ค. ์™œ๋ƒ๋ฉด ๋ฐ”๋‚˜๋‚˜, ์‚ฌ๊ณผ๋Š” ๊ฐ์ž ๋”ฐ๋Š” ํ–‰์œ„์—์„œ๋Š” ์„œ๋กœ ์—ฐ๊ด€์ด ์—†๊ธฐ์—

์‚ฌ๊ณผ ๋‹ค๋”ธ๋•Œ๊นŒ์ง€ ๋ฐ”๋‚˜๋‚˜๋ฅผ ๋ชป๋”ฐ๊ณ  ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋Š”๊ฑฐ๋‹ค.

๋งŒ๋“ค์ž ๋งˆ์ž ๋ฐ”๋กœ ์‹คํ–‰๋˜์–ด ๋ฒ„๋ฆฌ๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ๋ณด์ž!

async function pickFruits() {
  const applePromise = getApple();
  const bananaPromise = getBanana();
  // ์‚ฌ๊ณผ์™€ ๋ฐ”๋‚˜๋‚˜์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋งŒ๋“ค๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” promise ์˜ ํŠน์„ฑ์„ ์ด์šฉ!
  const apple = await applePromise; // ๋™๊ธฐํ™” ์ˆ˜ํ–‰
  const banana = await bananaPromise; // ๋™๊ธฐํ™” ์ˆ˜ํ–‰
  return `๋ณ‘๋ ฌ์  ์‹คํ–‰ ์ด์ œ 3์ดˆ๋ฐ–์— ์•ˆ๊ฑธ๋ฆฐ๋‹ค! ${apple} + ${banana}`;
}

pickFruits().then(console.log)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined

๋ณ‘๋ ฌ์  ์‹คํ–‰ ์ด์ œ 3์ดˆ๋ฐ–์— ์•ˆ๊ฑธ๋ฆฐ๋‹ค! ๐ŸŽ + ๐ŸŒ

์‚ฌ๊ณผ์™€ ๋ฐ”๋‚˜๋‚˜์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๋งŒ๋“ค๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ํŠน์„ฑ์„ ์ด์šฉํ•ด์„œ ์ด์ œ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ์—,

๋งŒ๋“ค์ž ๋งˆ์ž ๋™์‹œ์— ๋”ฐ์„œ ๊ธฐ๋‹ค๋ ค ๋†จ๋‹ค๊ฐ€ ์จ๋จน๋Š” ๊ฒƒ์ด๋‹ค.

์‚ฌ๊ณผ 3์ดˆ ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋‚˜๋‚˜ 3์ดˆ.. 6์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

๋ชจ๋‘ ๋”ฐ๋Š” ๋ฐ 3์ดˆ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

3์ดˆ ๋งŒ์— ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰, ์ฆ‰ ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์…ˆ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋งค์šฐ ๋”ํ‹ฐํ•œ ์ฝ”๋“œ์ด๋‹ค. Promise.all() ์— ๋Œ€ํ•ด ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘ฝ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋Š” Promise.all()

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

pickAllFruits().then(console.log)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined

๐ŸŽ + ๐ŸŒ

Promise.all() ์€ ๋‚ด๋ถ€ ์ธ์ž๋กœ ํ”„๋กœ๋ฏธ์Šค ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋•Œ, ๋ชจ๋“  Promise ๋“ค์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋‹ค ๋ฐ›์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๋ชจ์•„์ฃผ๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

๐ŸŒฑ๋จผ์ € ๋”ฐ์˜จ ์ฒซ๋ฒˆ์งธ ๊ณผ์ผ๋งŒ ๋ฐ›์•„์˜ค๋Š” Promise.race()

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

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

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

async function getMelon() {
  await delay(1000)
  return '๐Ÿˆ';
}

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

pickOnlyOne().then(console.log)

pickOnlyOne().then(console.log)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined

๐Ÿˆ

Promise.race() ๋Š” ์ธ์ž๋กœ ๋ฐฐ์—ด์— ์ „๋‹ฌ๋œ Promise ์ค‘์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” Promise ๋งŒ ์ „๋‹ฌ์ด ๋˜์–ด์ง„๋‹ค.

1์ดˆ ๋งŒ์— ๋”ฐ์ง€๋Š” ๋ฉœ๋ก ์ด ๋จผ์ € ์ถœ๋ ฅ๋˜์–ด ๋‚˜์˜จ๋‹ค!


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook