230412 - promise

๋ฐฑ์Šน์—ฐยท2023๋…„ 4์›” 13์ผ
1

๐Ÿšฉ promise

promise

๐Ÿ“ ์„ค๋ช…

  • ์ฝœ๋ฐฑ(callback) ์ค‘์ฒฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•จ
  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์คŒ


โœ’๏ธ ์ฝ”๋“œ ์ž‘์„ฑ

์ž…๋ ฅ

์˜ˆ์ œ1

js

const myPromise = new Promise((resolve, reject) => {
  // ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜ด - resolve(์„ฑ๊ณต), reject(์‹คํŒจ)

  setTimeout(() => {
    // resolve(111); // 1์ดˆ ๋’ค์— ์„ฑ๊ณตํ•˜๋Š” promise
    reject(new Error()); // 1์ดˆ ๋’ค์— ์—๋Ÿฌ ๋ฐœ์ƒ
  }, 1000);
});

// promise๊ฐ€ ๋๋‚˜๊ณ  ํ•  ์ž‘์—… ์„ค์ •
myPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.log(error);
  });

์˜ˆ์ œ2

js

function runDelay(seconds) {
  // ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š์Œ
  return new Promise((resolve, reject) => {
    // (์„ฑ๊ณต, ์‹คํŒจ) // ์—ฌ๊ธฐ์„œ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌ๋ฐ›์Œ
    // ์‹คํ–‰๊ตฌ
    if (!seconds || seconds < 0) {
      // ์‹œ๊ฐ„์ด ๋„˜์–ด์˜ค์ง€ ์•Š์•˜๊ฑฐ๋‚˜ 0๋ณด๋‹ค ์ž‘์•˜์„ ๋•Œ
      reject(new Error("์‹œ๊ฐ„์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•จ")); // ์—๋Ÿฌ ๋ฐœ์ƒ. ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ณณ์€ ์•„์ง ์—†์Œ
    }
    setTimeout(resolve, seconds * 1000);
  });
}

runDelay(2)
  // ํ•„์š”ํ•œ ์ผ์„ ์ˆ˜ํ–‰. ์„ฑ๊ณต
  .then(() => {
    console.log("ํƒ€์ด๋จธ ์™„๋ฃŒ");
  })

  // ์—๋Ÿฌ์ฒ˜๋ฆฌ. ์‹คํŒจ
  // .catch((error) => { console.error(error); });
  .catch(console.error) // ์ „๋‹ฌ๋œ ์ธ์ž์™€ ํ˜ธ์ถœํ•  ์ธ์ž๊ฐ€ ๊ฐ™์„ ๋• ์ƒ๋žต ๊ฐ€๋Šฅ

  // ์ตœ์ข…. ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ
  .finally(() => {
    console.log("๋");
  });

/*
function runDelay(callback, seconds) {
  // ์ธ์ž ๊ฐ’ 2๊ฐœ
  if (!callback) {
    throw new Error("callback ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค");
  }
  if (!seconds || seconds < 0) {
    // ์‹œ๊ฐ„์ด ๋„˜์–ด์˜ค์ง€ ์•Š์•˜๊ฑฐ๋‚˜ 0๋ณด๋‹ค ์ž‘์•˜์„ ๋•Œ
    throw new Error("์‹œ๊ฐ„์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•จ");
  }
  setTimeout(callback, seconds * 1000);
}


// try catch : ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ์ข…๋ฃŒ(app crashed) ๋˜์ง€ ์•Š๊ณ  ์ž‘๋™ ๋˜๋„๋ก ํ•จ(๋น„๋™๊ธฐ์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•จ)
try {
  runDelay(() => {
    console.log("ํƒ€์ด๋จธ ์™„๋ฃŒ");
  }, -2);
} catch {
  console.log("ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ");
}
*/

์ถœ๋ ฅ

  • ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด

2์ดˆ ํ›„ ์‹คํ–‰


๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ & ๋„์›€์ด ๋˜๋Š” ๋งํฌ





promise ์‘์šฉ

โœ’๏ธ ์ฝ”๋“œ ์ž‘์„ฑ

์ž…๋ ฅ

js

function fetchEgg(chicken) {
  // return new Promise((resolve, reject) => {});
  return Promise.resolve(`${chicken}  -> ๐Ÿฅš`);
}

function friedEgg(egg) {
  return Promise.resolve(`${egg} -> ๐Ÿณ`);
}

function getChicken() {
  // return Promise.resolve(`๐ŸŒฟ -> ๐Ÿ”`);
  return Promise.reject(new Error("์น˜ํ‚จ์„ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์—†์Œ"));
}

getChicken() // ๐ŸŒฟ -> ๐Ÿ”
  // catch ๋งจ ์ฒ˜์Œ์— ์ž‘์„ฑ ๊ฐ€๋Šฅ
  // .catch((error) => {
  //   console.log(error.name)
  //   return "๐Ÿ”" // ์—๋Ÿฌ๋Š” ๋‚˜์ง€๋งŒ undefined์— ์ถ”๊ฐ€๋จ
  // }) 
  .catch(() => "๐Ÿ”") // ๋Œ€์ฒด๊ฐ’์„ ๋„ฃ์–ด์ค˜์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•จ.
  .then((chicken) => { return fetchEgg(chicken) }) // ๐ŸŒฟ -> ๐Ÿ”  -> ๐Ÿฅš
  .then((egg) => friedEgg(egg)) // ๐ŸŒฟ -> ๐Ÿ”  -> ๐Ÿฅš -> ๐Ÿณ
  .then(console.log)
  // .catch((error)=>console.log(error.name))
  
  // ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ
  // .then(fetchEgg)
  // .then(friedEgg)
  // .then(console.log)

/*
fetchEgg("๐Ÿ”").then((egg) => {
  console.log("๋ฐ›์•„์˜จ ๊ฒƒ์€? : ", egg); // ์ธ์ž๊ฐ’์€ fetchEggํ•จ์ˆ˜์˜ ๋ฆฌํ„ด 
  // .then(console.log(egg)); // ๋ฐ›์•„์˜จ ์ธ์ž์™€ ํ˜ธ์ถœํ•œ ์ธ์ž๊ฐ€ ๊ฐ™์„ ์‹œ ์ƒ๋žต ๊ฐ€๋Šฅ
});
*/

์ถœ๋ ฅ

  • ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด

๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ & ๋„์›€์ด ๋˜๋Š” ๋งํฌ










promise method

โœ’๏ธ ์ฝ”๋“œ ์ž‘์„ฑ

์ž…๋ ฅ

js

function getBanana() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("๐ŸŒ");
    }, 3000);
  });
}

function getApple() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("๐ŸŽ");
    }, 2000);
  });
}

function getKiwi() {
  return Promise.reject(new Error("ํ‚ค์œ„๋Š” ์—†์–ด์š” ใ… ใ… "));
}

// ๋ฐ”๋‚˜๋‚˜์™€ ์‚ฌ๊ณผ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง€๊ณ  ์™€์„œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ฆ
getBanana() // ํ˜ธ์ถœ
  // banana์—์„œ ๋ฐ›์•„ ์˜จ ๋‚ด์šฉ์„ apple์— ์ „๋‹ฌ -> ์ „๋‹ฌ๋ฐ›์€ apple์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ฆ (๊ณผ์ •์ด ๋‚ด๋ถ€์—์„œ ์ด๋ฃจ์–ด์ง)
  .then((banana) =>
    getApple().then((apple) => {
      return [banana, apple]; // ํ•œ ์ค„์ด๋ผ return ์ƒ๋žต ๊ฐ€๋Šฅ
    })
  )
  .then(console.log); // ๋ฐ”๋‚˜๋‚˜ 3์ดˆ + ์‚ฌ๊ณผ 1์ดˆ = 4์ดˆ ํ›„ ์ถœ๋ ฅ

// ํ•œ๋ฒˆ์— ๋ชจ๋“  promise๋“ค์„ ์‹คํ–‰(๋ณ‘๋ ฌ์ ์œผ๋กœ)
Promise.all([getBanana(), getApple()]).then((fruits) =>
  console.log("all - ", fruits)
); // ์ด 3์ดˆ

Promise.all([getBanana(), getApple(), getKiwi()])
  .then((fruits) => console.log("all error - ", fruits)) // ์ถœ๋ ฅโŒ
  .catch(console.log); // ์—๋Ÿฌ ์žˆ๋Š” ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ

// promise๋“ค ์ค‘์— ์ œ์ผ ๋นจ๋ฆฌ ์ˆ˜ํ–‰๋œ ์ฝ”๋“œ๋งŒ ์‹คํ–‰
Promise.race([getBanana(), getApple()])
  .then((fruits) => console.log("race - ", fruits)) // ์‚ฌ๊ณผ๋งŒ ๋ณด์ž„
  .catch((error) => {
    console.log(error);
  });

// ๋ชจ๋“  ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ์‹ถ์„ ๋•Œ
Promise.allSettled([getBanana(), getApple(), getKiwi()])
  .then((fruits) => console.log("allSettled - ", fruits)) // ๋ชจ๋“  ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ถœ๋ ฅ
  .catch(console.log); // ๋”ฐ๋กœ ์ถœ๋ ฅโŒ

์ถœ๋ ฅ

  • ์ด๋ฏธ์ง€๋กœ ๋Œ€์ฒด

๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ & ๋„์›€์ด ๋˜๋Š” ๋งํฌ






profile
๊ณต๋ถ€ํ•˜๋Š” ๋ฒจ๋กœ๊ทธ

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