[TIL] JavaScript: Promise ๐Ÿค™

Basยท2021๋…„ 3์›” 8์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
8/12


๐Ÿ”‘ Point
๐ŸŽ‰ promise?
๐ŸŽ‰ promise state
๐ŸŽ‰ consumer: then, catch, finally


1. promise ๋ž€?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ˆ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š”! ๋น„๋™๊ธฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” object์ž…๋‹ˆ๋‹ค!
  • ์ •ํ•ด์ง„ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๋ฉด ๊ฐ’์„, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด Error๋ฅผ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค.
  • callbackํ•จ์ˆ˜ ๋Œ€์‹  ๊น”๋”ํ•˜๊ณ  ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ดˆ์ ์„ ๋‘ฌ์•ผ ํ•  ๋‚ด์šฉ

  • 'state, ์ƒํƒœ'์—๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ.
    pending state -> fulfiied state || rejected state
  • producer(์ •๋ณด ์ œ๊ณต)์™€ consumer(์ •๋ณด ์ด์šฉ) ์ดํ•ดํ•˜๊ธฐ!

2. Promise Object๋งŒ๋“ค๊ธฐ!

promise๋ฅผ ๋งŒ๋“œ๋Š” ๊ตฌ์กฐ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const promise = new Promise(resolve, reject) => {});

const promise = new Promise(resolve, reject) => {
	setTimeout(() => {
    resolve('hyojin'); --case A
    reject(new Error('no network'));-- case B
    }, 2000);
});

์ฃผ์˜
โญ๏ธ pormise๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
โญ๏ธ ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”๊ตฌํ•  ๋•Œ๋งŒ(ex_๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ) ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด ์ ์„ ์—ผ๋‘ํ•ด์•ผํ•œ๋‹ค.

3. Promise ์‚ฌ์šฉํ•˜๊ธฐ! consumer ๋งŒ๋“ค๊ธฐ: then, catch, finally

1) then: ์„ฑ๊ณต์ ์ธ ์ผ€์ด์Šค์ผ ๋•Œ -> resolve ํ˜ธ์ถœ

2) catch: ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ -> reject ํ˜ธ์ถœ

3) finally: ์„ฑ๊ณต, ์‹คํŒจ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ ๋จ

Promise
  .then(value => {
  console.log(value);
  })
  .catch(error => {
  console.log(error);
  })
  .finally(() => {
  console.log('finally');
  });

2) catch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ~

  • ์˜ค๋ฅ˜๊ฐ€ ์—†์„ ๋•Œ
const getHen = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve('๐Ÿ“'), 1000);
  });
const getEgg = hen =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${hen} => ๐Ÿฅš`), 1000);
  });
const cook = egg => 
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${egg} => ๐Ÿณ`), 1000);
  });

getHen()
  .then(hen => getEgg(hen))
  .then(egg => cook(egg))
  .then(meal => console.log(meal));
---------------------------------------------
// ๐Ÿ“ => ๐Ÿฅš => ๐Ÿณ
---------------------------------------------
// ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ํ•˜๋‚˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
getHen()
  .then(getEgg)
  .then(cook)
  .then(console.log);
  • ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ
const getHen = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve('๐Ÿ“'), 1000);
  });
const getEgg = hen =>
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(new Error(`error! ${hen} => ๐Ÿฅš`)), 1000);
  });
const cook = egg => 
  new Promise((resolve, reject) => {
    setTimeout(() => resolve(`${egg} => ๐Ÿณ`), 1000);
  });

// ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ํ•˜๋‚˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
getHen()
  .then(getEgg)
  .catch(error => {
    return '๐Ÿฅ–';
  })
  .then(cook)
  .then(console.log)
  .catch(console.log);
----------------------
//๐Ÿฅ– => ๐Ÿณ (์—๋Ÿฌ ๋นต๊พธ ์ฒ˜๋ฆฌ!)
// ๋งŒ์•ฝ ๋นต๊พธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด? 
// Error: error! ๐Ÿ“ => ๐Ÿฅš
profile
๋ฐ”์Šค๋ฒ„๊ฑฐ

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