[Javascript] promise

์ˆ˜๋ฏผ๐Ÿฃยท2022๋…„ 6์›” 4์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
28/32

๐Ÿ’ญ promise

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” object
์ •ํ•ด์ง„ ์žฅ์‹œ๊ฐ„์— ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜์„œ ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋Šฅ์ด ์ˆ˜ํ–‰์ด ๋˜์–ด ์กŒ๋‹ค๋ฉด ์„ฑ๊ณต์˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋‹ฌ ํ•ด์ค€๋‹ค.
๋งŒ์•ฝ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค.

1. producer
network์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ, files์—์„œ ํฐ ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ ๊ทธ๋ž˜์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ๋ผ์ธ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ผ๋“ค์€ promise๋กœ ๋งŒ๋“ค์–ด์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰, promise object๋ฅผ ๋งŒ๋“ค ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ๋“ค์˜ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ์ž˜ํ–ˆ๋‹ค๋ฉด resolve๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  ์‹คํŒจ ํ–ˆ๋‹ค๋ฉด ์‹คํŒจํ•œ ๊ฒƒ๊ณผ ์™œ ์‹คํŒจํ–ˆ๋Š”์ง€ ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌ ํ•ด ์ค€๋‹ค.

const promise = new Promise((resoleve, reject) => {
	// doing some geavy word (metwork, read files)
  setTimout(() => {
    resolve('์ˆ˜๋ฏผ');
    reject(new Error('no network'));
  }, 2000);
});
  • Promise

    • executor(callback function)์„ ์ „๋‹ฌํ•ด ์ค€๋‹ค.
      : exector๋Š” ๋‘๊ฐœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋ฐ ( resolve, reject )
      resolve : ๊ธฐ๋Šฅ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์„œ ๋งˆ์ง€๋ง‰์— ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜
      reject : ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
      โžก promise๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ๊ฐ„ executor ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ ๋œ๋‹ค. ์ผ์ด ๋๋‚˜๋ฉด executor ๋‚ด๋ถ€์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ฝœ๋ฐฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœ
  • Promise์˜ ์ƒํƒœ ๊ฐ’

    • pending: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰ ์ „(resolve, reject๊ฐ€ ์•„์ง ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ)
    • fulfilled: ์ˆ˜ํ–‰ ์„ฑ๊ณต(resolve๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ)
    • rejected: ์ˆ˜ํ–‰ ์‹คํŒจ(reject๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ)
    • settled: ์„ฑ๊ณต or ์‹คํŒจ(resolve๋‚˜ reject๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ)

2. comsumer (ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ)
then, catch, finally๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ฐ›์•„ ์˜ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์„ฑ๊ณตํ•œ ๊ฐ’, ์‹คํŒจํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์™€์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ํ•ด ์ค€๋‹ค.

Promise
	.then(value => {
  		console.log(value);
})
	.catch(error => {
  		console.log(error);
})
	.finally(() => {
		console.log('finally');
})
  • .then(์„ฑ๊ณต ์‹œ, ์‹คํŒจ ์‹œ)
    promise๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ์ˆ˜ํ–‰์ด ๋œ๋‹ค๋ฉด ๋‚ด๊ฐ€ ๊ฐ’์„ ๋ฐ›์•„ ์˜ด -> resolve ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ ๋œ ๊ฐ’!
    ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•ด ์คŒ
    ๊ฐ’๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋˜ ๋‹ค๋ฅธ promise๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

  • .catch(์‹คํŒจ ์‹œ)
    ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€

  • .finally()
    ์„ฑ๊ณต๊ณผ ์‹คํŒจ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

3. Promise chaining
then์„ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์ธ ์—ฌ๋Ÿฌ๊ฐ€์ง€(Promise)๋ฅผ ๋™์‹œ์— ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

new Promise((resolve, reject) => {
	setTimeout(() => resolve("promise 1"), 1000);
}).then((result) => { // ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ์“ฐ๊ณ ,
	console.log(result); // promise 1
	return new Promise(...);
}).then((result) => { // ์ด๋ ‡๊ฒŒ ์—ฐ๋‹ฌ์•„ then์„ ์จ์„œ ์ด์–ด์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”.
	console.log(result);
	return new Promise(...);
}).then(...);

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

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