๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/Javascript

[JS] Promise ๊ฐœ๋… ๋ฐ ํ™œ์šฉ

by lee365 2021. 7. 6.
๋ฐ˜์‘ํ˜•

๐ŸŒŸ Promise

  • ES6 
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” object
  • ํ”„๋กœ๋ฏธ์Šค๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด, ์„ฑ๊ณต์˜ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋‹ฌํ•ด์ค€๋‹ค.
    ๋งŒ์•ฝ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด error๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค.
  • Producer vs Consumer (์ƒ์‚ฐ์ž์™€ ์‚ฌ์šฉ์ž ์ฐจ์ด์  ์ดํ•ด)
  • ๋น„๋™๊ธฐ ์ˆ˜ํ–‰์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. 

Promise State

pending(๋ณด๋ฅ˜) -> fulfilled(์ดํ–‰) or rejected(๊ฑฐ๋ถ€)

 


1. Producer (์ƒ์‚ฐ์ž)

  • Promise ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ฆ‰์‹œ executor(์ฝœ๋ฐฑํ•จ์ˆ˜)๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
const promise = new Promise((resolve, reject) => {
  // doing some heavy work (network, read file O/I)
  console.log('doing something...');
  setTimeout(() => {
    resolve('ellie');
    // reject(new Error('no network'));
  }, 2000);
});


2. Consumer (์†Œ๋น„์ž)

  • then, catch, finally
promise
  .then((value) => {
    // promise๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด resolve๋กœ ์ „๋‹ฌํ•œ value๊ฐ€ ๋“ค์–ด์˜ด
    // then์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์‹œ promise๊ฐ€ ํ˜ธ์ถœ๋จ.
    console.log(value);
  })
  .catch((error) => console.log(error))
  .finally(() => console.log('finally'));


3. Promise chaining

  • ๊ตฌ์กฐํ™”๋œ ์ฝœ๋ฐฑ ์ž‘์„ฑ๊ฐ€๋Šฅ!
const fetchNumber = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
});

fetchNumber
  .then((num) => num * 2)
  .then((num) => num * 3)
  .then((num) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(num - 1), 1000);
    });
  })
  .then((num) => console.log(num));

 

4. Error handling

  • catch๋กœ error๋ฅผ ํ—จ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค
  • error๊ฐ€ ๋ฐœํ–‰ํ•ด๋„ catch๋ฅผ ์ด์šฉํ•˜๋ฉด ์ „์ฒด์ ์ธ Promise ์ฒด์ธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
const getHen = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve('๐Ÿ”'), 1000);
  });
const getEgg = (hen) =>
  new Promise((resolve, reject) => {
    setTimeout(() => reject(new Error(`error! ${hen} => ๐Ÿฅš`)), 1000);
  });

const cook = (egg) =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${egg} => ๐Ÿณ`), 1000);
  });

getHen()
  .then(getEgg) //(hen) => getEgg(hen) ์ƒ๋žต๊ฐ€๋Šฅ
  .catch((error) => {
    return '๐Ÿฅฏ'; // ๊ณ„๋ž€์„ ๋ฐ›์•„์˜ฌ ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋นต์œผ๋กœ ๋Œ€์ฒด
  })
  .then(cook)
  .then(console.log)
  .catch(console.log);

 

์ฐธ๊ณ 

๐ŸŒŸ๋“œ๋ฆผ์ฝ”๋”ฉ ์—˜๋ฆฌ๋‹˜์˜ youtube๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค๐ŸŒŸ

๐Ÿ‘‰youtube๊ฐ•์˜ https://www.youtube.com/watch?v=JB_yU6Oe2eE&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=12

 

๋ฐ˜์‘ํ˜•

'์–ธ์–ด > Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL01 | JavaScrpit ๋ณ€์ˆ˜  (0) 2021.09.26
[JS] Dynamic typing (dynamic type vs static type)  (0) 2021.07.10
[JS] undefined์™€ null  (0) 2021.07.10
[JS] async function  (0) 2021.07.08
[JS] Array api ์ด ์ •๋ฆฌ  (0) 2021.07.05