๐Ÿ’ก ํ•ต์‹ฌ

๐Ÿ“Œ ๊ฐœ์š”

๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งž์ดํ•  ๋ฏธ๋ž˜์˜ ์™„๋ฃŒ/์‹คํŒจ์™€ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’

  • ์‰ฝ๊ฒŒ ๋งํ•ด, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์™„๋ฃŒ/์‹คํŒจ ์—ฌ๋ถ€์™€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‹ด์•„๋†“๋Š” ๊ฐ์ฒด
  • Promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์น˜ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๊ฐ’ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ

๐Ÿ“Œ Promise์˜ States

Promise๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง

  1. ๋Œ€๊ธฐ(pending) : ์ดํ–‰ํ•˜์ง€๋„, ๊ฑฐ๋ถ€ํ•˜์ง€๋„ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ
  2. ์ดํ–‰(fulfilled) : ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ
  3. ๊ฑฐ๋ถ€(rejected) : ์—ฐ์‚ฐ ์‹คํŒจ

๐Ÿ“Œ settled์™€ locked-in?

์ด๋“ค์€ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค!!

  • ์–ธ์–ด์  ํŽธ์˜๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” '์šฉ์–ด'

settled

  • pending์ด ์•„๋‹Œ ๊ฒƒ!
  • ์ฆ‰, fulfilled ๋˜์—ˆ๊ฑฐ๋‚˜ rejected ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ

locked-in

  • P์˜ settlement value๊ฐ€ Q๋ผ๊ณ  ํ•  ๋•Œ, Q์˜ Promise๊ฐ€ resolved/rejected ๋˜์–ด์•ผ P์˜ settlement value๊ฐ€ ๊ฒฐ์ •๋จ
    โ†’ P๋ฅผ Q์— lock-in ํ•œ๋‹ค!! (P๊ฐ€ locked-in ๋˜๋Š” ์ฃผ์ฒด)

๐Ÿ“Œ Promise์˜ Fates

Promise๋Š” ๋‹ค์Œ 2๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ fate๋ฅผ ๊ฐ€์ง

  1. resolved : Promise๋ฅผ resolve/reject ํ•˜๋ ค ํ•ด๋„ ํšจ๊ณผ๊ฐ€ ์—†๋Š” ์ƒํƒœ
    ์ฆ‰, locked-in์ด๊ฑฐ๋‚˜ fulfilled, rejected

  2. unresolved : resolved ๋˜์ง€ ์•Š์€ ์ƒํƒœ

โญ ์ค‘์š”ํ•œ ๊ฑด, fulfill๊ณผ resolve๋Š” ๊ฐ™์€ ๋ง์ด ์•„๋‹˜!!


๐Ÿ“Œ Promise์˜ ๊ณผ์ •

  • ์ดํ–‰ ๋˜๋Š” ๊ฑฐ๋ถ€ ๋  ๋•Œ, then ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋Œ€๊ธฐ์—ด(ํ)์— ์ถ”๊ฐ€๋˜์—ˆ๋˜ ์ฒ˜๋ฆฌ๊ธฐ๋“ค์ด ํ˜ธ์ถœ๋จ
new Promise((resolveOuter) => {
  resolveOuter(
    new Promise((resolveInner) => {
      setTimeout(resolveInner, 1000);
    }),
  );
});
  • ์ด Promise๋Š” ์ƒ์„ฑ๋  ๋•Œ resolveOuter๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ,
    ๋‹ค๋ฅธ Promise์™€ ํ•จ๊ป˜ ํ•ด๊ฒฐ๋˜๋ฏ€๋กœ 1์ดˆ ํ›„ ๋‚ด๋ถ€ Promise๊ฐ€ fulfill ๋  ๋•Œ๊นŒ์ง€๋Š” fulfill๋˜์ง€ ์•Š์Œ

๐Ÿ“Œ Promise ์ฒด์ด๋‹

  • then(), catch(), finally() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋“ค๋„ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

then()

  • ์ตœ๋Œ€ 2๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์Œ
    โ‘  ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ : Promise๊ฐ€ ์ดํ–‰๋œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜
    โ‘ก ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜ : Promise๊ฐ€ ๊ฑฐ๋ถ€๋œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

  • Promise์˜ ์ข…๋ฃŒ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฒด์ธ์—์„œ ๋‹ค์Œ Promise์˜ settled ์ƒํƒœ ๊ฒฐ์ •


๐Ÿ“Œ Promise ๋™์‹œ์„ฑ

Promise ํด๋ž˜์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๋™์‹œ์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 4๊ฐ€์ง€ ์ •์  ๋ฉ”์„œ๋“œ ์ œ๊ณต

  1. Promise.all() : ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋˜๋ฉด ์ดํ–‰๋˜๊ณ , ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ๋ถ€๋˜๋ฉด ๊ฑฐ๋ถ€๋จ
  2. Promise.allSettled() : ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ดํ–‰๋จ
  3. Promise.any() : ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ดํ–‰๋˜๋ฉด ์ดํ–‰ํ•˜๊ณ , ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋˜๋ฉด ๊ฑฐ๋ถ€๋จ
  4. Promise.race() : ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๊ฒฐ๋˜๋ฉด ํ•ด๊ฒฐ๋จ (์ฆ‰, ํ•˜๋‚˜๋ผ๋„ ์ดํ–‰๋˜๋ฉด ์ดํ–‰๋˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ๋ถ€๋˜๋ฉด ๊ฑฐ๋ถ€๋จ)

๐Ÿ“Œ ์ถ”๊ฐ€ ์ •์  ๋ฉ”์„œ๋“œ

์ •์  ๋ฉ”์„œ๋“œ

  1. Promise.reject(reason) : ์ฃผ์–ด์ง„ ์‚ฌ์œ ๋กœ ๊ฑฐ๋ถ€ํ•˜๋Š” Promise ๊ฐ์ฒด ๋ฐ˜ํ™˜
  2. Promise.resolve() : ์ฃผ์–ด์ง„ ๊ฐ’์œผ๋กœ ์ดํ–‰ํ•˜๋Š” Promise ๊ฐ์ฒด ๋ฐ˜ํ™˜
    ์ด๋•Œ ์ง€์ •ํ•œ ๊ฐ’์ด then ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ, Promise.resolve()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋Š” then ๋ฉ”์„œ๋“œ๋ฅผ "๋”ฐ๋ผ๊ฐ€์„œ" ์ž์‹ ์˜ ์ตœ์ข… ์ƒํƒœ ๊ฒฐ์ •

๐Ÿ“Œ ํ™œ์šฉ ์˜ˆ์ œ

let myFirstPromise = new Promise((resolve, reject) => {
  // ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ resolve(...)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์‹คํŒจํ•œ ๊ฒฝ์šฐ reject(...)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  // ์ด ์˜ˆ์ œ์—์„œ๋Š” setTimeout()์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ํ‰๋‚ด๋ƒ…๋‹ˆ๋‹ค.
  // ์‹ค์ œ๋กœ๋Š” ์—ฌ๊ธฐ์„œ XHR์ด๋‚˜ HTML5 API๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  setTimeout(function () {
    resolve("์„ฑ๊ณต!"); // ์™€! ๋ฌธ์ œ ์—†์Œ!
  }, 250);
});

myFirstPromise.then((successMessage) => {
  // successMessage๋Š” ์œ„์—์„œ resolve(...) ํ˜ธ์ถœ์— ์ œ๊ณตํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  // ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋Š” ๋ฒ•์€ ์—†์ง€๋งŒ, ์œ„์—์„œ ๋ฌธ์ž์—ด์„ ์คฌ์œผ๋‹ˆ ์•„๋งˆ ๋ฌธ์ž์—ด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  console.log("์™€! " + successMessage);
});
  • new Promise()๋กœ ์ƒˆ๋กœ์šด Promise ๊ฐ์ฒด ์ƒ์„ฑ
  • ์ด Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋๋‚œ ํ›„, 2๊ฐ€์ง€ ์ฝœ๋ฐฑ ์ค‘ ํ•˜๋‚˜์ธ resolve๋‚˜ reject๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ดํ–‰/๊ฑฐ๋ถ€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ฆผ
  • setTimeout() ๋น„๋™๊ธฐ ์ž‘์—…์ด ์ž˜ ์‹คํ–‰๋˜๋ฉด, resolve("์„ฑ๊ณต!")์ด Promise๋ฅผ ์ดํ–‰ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ, "์„ฑ๊ณต!"์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•จ
  • myFirstPromise.then(...)์€ Promise๊ฐ€ ์ดํ–‰ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์‹คํ–‰ํ•  ์ฝ”๋“œ ์ •์˜
  • successMessage๋Š” resolve("์„ฑ๊ณต!") ํ˜ธ์ถœ์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’, ์ฆ‰ "์„ฑ๊ณต!"

์˜ค๋ฅ˜ ์‹คํ–‰ ์˜ˆ์ œ

// ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‹คํ—˜ํ•˜๊ธฐ ์œ„ํ•ด 'threshold' ๊ฐ’์€ ๋ฌด์ž‘์œ„๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
const THRESHOLD_A = 8; // 0์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function tetheredGetNumber(resolve, reject) {
  setTimeout(() => {
    const randomInt = Date.now();
    const value = randomInt % 10;
    if (value < THRESHOLD_A) {
      resolve(value);
    } else {
      reject(`Too large: ${value}`);
    }
  }, 500);
}

function determineParity(value) {
  const isOdd = value % 2 === 1;
  return { value, isOdd };
}

function troubleWithGetNumber(reason) {
  const err = new Error("Trouble getting number", { cause: reason });
  console.error(err);
  throw err;
}

function promiseGetWord(parityInfo) {
  return new Promise((resolve, reject) => {
    const { value, isOdd } = parityInfo;
    if (value >= THRESHOLD_A - 1) {
      reject(`Still too large: ${value}`);
    } else {
      parityInfo.wordEvenOdd = isOdd ? "odd" : "even";
      resolve(parityInfo);
    }
  });
}

new Promise(tetheredGetNumber)
  .then(determineParity, troubleWithGetNumber)
  .then(promiseGetWord)
  .then((info) => {
    console.log(`Got: ${info.value}, ${info.wordEvenOdd}`);
    return info;
  })
  .catch((reason) => {
    if (reason.cause) {
      console.error("Had previously handled error");
    } else {
      console.error(`Trouble with promiseGetWord(): ${reason}`);
    }
  })
  .finally((info) => console.log("All done"));
  • tetheredGetNumber()๋Š” ๋žœ๋ค ์ •์ˆ˜๋ฅผ 10์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ THRESHOLD_A๋ณด๋‹ค ์ž‘์œผ๋ฉด resolve, ํฌ๋ฉด reject ๋˜๋Š” ํ•จ์ˆ˜
  • ์—ฌ๊ธฐ์„œ THRESHOLD_A๊ฐ€ 0์ด๋ฉด ํ•ญ์ƒ reject ๋จ

  • determineParity๋Š” ํ™€์ˆ˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜

  • troubleWithGetNumber๋Š” reason์— ๋งž๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋Š” ํ•จ์ˆ˜

  • promiseGetWord๋Š” ์ˆซ์ž์˜ ํ™€์ง ์—ฌ๋ถ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜
  • value๊ฐ€ THRESHOLD_A - 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์˜ค๋ฅ˜
  • ์ž‘์œผ๋ฉด parityInfo ๊ฐ์ฒด์— wordEventOdd ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ isOdd ๊ฐ’์— ๋”ฐ๋ผ ๋ฌธ์ž์—ด ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ•จ

๐Ÿ’ก ์ฐธ๊ณ  ์ž๋ฃŒ

profile
์‰ฝ๊ฒŒ๋งŒ์‚ด์•„๊ฐ€๋ฉด์žฌ๋ฏธ์—†์–ด๋น™๊ณ 

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN