Promise ๐Ÿค๐Ÿป | ๋™๊ธฐ, ๋น„๋™๊ธฐ ๊ฐœ๋…

Yoonminยท2024๋…„ 12์›” 12์ผ
0

javascript

๋ชฉ๋ก ๋ณด๊ธฐ
1/3
post-thumbnail

๐Ÿค๐Ÿป Promise๋ž€?

'์•ฝ์†'์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ์ผ์–ด๋‚  ์ผ์„ ์•ฝ์†ํ•˜๋Š” ๊ฒƒ์œผ๋กœ
๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

โœ… ๋น„๋™๊ธฐ? ๋™๊ธฐ? ์–ด๋””์„œ ๋งŽ์ด ๋“ค์–ด๋ดค๋Š”๋ฐ?

์—ฌ๋Ÿฟ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋™๊ธฐ, ๋น„๋™๊ธฐ๋ผ๋Š” ๋ง์„ ๋งŽ์ด ๋“ค์–ด ๋ณด์‹œ์ง€ ์•Š์•˜๋‚˜์š”?

โœ”๏ธ ๋™๊ธฐ

๋™๊ธฐ๋Š” ์ง๋ ฌ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

โœ”๏ธ ๋น„๋™๊ธฐ

๋น„๋™๊ธฐ๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด์ด๋Š” ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ๋Š” ํŠน์ • ์ฝ”๋“œ๊ฐ€ ๋๋‚ ๋•Œ ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

ํ•œ๋ฒˆ ์‚ฌ์ง„์„ ํ†ตํ•ด ๋น„๊ตํ•ด๋ณผ๊นŒ์š”?
[ ์ถœ์ฒ˜ | What every programmer should know about Synchronous vs. Asynchronous Code]

์™ผ์ชฝ ๊ทธ๋ž˜ํ”„๋Š” '๋น„๋™๊ธฐ'๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ Task(๋นจ๊ฐ•, ๋ฏผํŠธ, ์˜๋กœ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„)๊ฐ€ ๋™์‹œ์— ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต์„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ์˜ค๋ฅธ์ชฝ ์ฐจํŠธ๋Š” '๋™๊ธฐ'์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ Task๊ฐ€ ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ Task๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์ฃ .

์ƒ‰๊น” ์ˆœ์„œ๋Œ€๋กœ ๋นจ๊ฐ•์ด ์‹คํ–‰๋˜๊ณ  ๋ฏผํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋…ธ๋ž‘์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ์— ์ด ์‹คํ–‰ ์‹œ๊ฐ„์œผ๋กœ ๋”ฐ์ง€์ž๋ฉด '๋™๊ธฐ' ๋ฐฉ์‹์ด ๋” ๋Š๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

NVIDIA GPU์™€ CPU์ฐจ์ด
ํ•ด๋‹น ๋งํฌ๋Š” NVIDIA์—์„œ CPU,GPU๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ์˜์ƒ์ž…๋‹ˆ๋‹ค.
์ €๋Š” ํ•ด๋‹น ์˜์ƒ์„ ๋ณด๋ฉด์„œ ๋™๊ธฐ(CPU) ๋น„๋™๊ธฐ(GPU)๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•„์š”ํ•˜์‹ ๋ถ„์€ ์‹œ์ฒญํ•ด์ฃผ์‹œ๋ฉด ํ•œ๋ฒˆ ๋ด์ฃผ์„ธ์š” :) (๋งค์šฐ ์งง์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰)

์ž ๊ทธ๋Ÿผ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋ณด์ฃ 

โœ… '๋™๊ธฐ(synchronous)'๋ž€ ๋ฌด์—‡์ผ๊นŒ?

๋™๊ธฐ๋Š” ์ง๋ ฌ์ ์œผ๋กœ Task๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ์ง€๋งŒ ๋‹ค์Œ ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์•ž์— Task๊ฐ€ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ๋‚˜๋จธ์ง€ ๋’ค์— Task๋“ค์ด ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒ๋‹ˆ๋‹ค.
์ถœ์ฒ˜ | poiemaweb

โœ… '๋™๊ธฐ(synchronous)'๋ž€ ๋ฌด์—‡์ผ๊นŒ?

๋น„๋™๊ธฐ๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ Task๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
Task๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•˜๋”๋ผ๋„ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ Task๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
์ถœ์ฒ˜ | poiemaweb

  1. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ ์ž ํ• ๋•Œ ์„œ๋ฒ„์— Task๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
  2. ์ดํ›„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ (Non-Blocking) ์ฆ‰์‹œ ๋‹ค์Œ Task๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. ์ดํ›„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰ํ•  Task๋ฅผ ๊ณ„์†ํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋Œ€๋ถ€๋ถ„์˜ DOM ์ด๋ฒคํŠธ์™€ Timer ํ•จ์ˆ˜(setTimeout, setInterval), Ajax ์š”์ฒญ์€ ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์€ ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ ์š”์ฒญ์ด ๋ธ”๋กœํ‚น(blocking, ์ž‘์—… ์ค‘๋‹จ)๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹จ์ 

ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋„ค์ŠคํŒ…(nesting, ์ค‘์ฒฉ)๋˜์–ด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ์ฝœ๋ฐฑ ํ—ฌ(Callback Hell)์ด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝœ๋ฐฑ ํ—ฌ์€ ๊ฐ€๋…์„ฑ์„ ๋‚˜์˜๊ฒŒ ํ•˜๋ฉฐ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.
ํ•˜๋‹จ ์ฝ”๋“œ๋Š” ์ฝœ๋ฐฑ ํ—ฌ์ด ๋ฐœ์ƒํ•˜๋Š” ์ „ํ˜•์ ์ธ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

step1(function(value1) {
  step2(value1, function(value2) {
    step3(value2, function(value3) {
      step4(value3, function(value4) {
        step5(value4, function(value5) {
            // value5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒ˜๋ฆฌ
        });
      });
    });
  });
});

โœ… Promise

๋™๊ธฐ ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ์ง€์‹์„ ์ฑ„์› ์œผ๋‹ˆ ํ•ด๋‹น ๊ธ€์˜ ์ค‘์‹ฌ์ธ Promise๋กœ ๋Œ์•„์™€๋ณด์ž

๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด(Promise ๊ฐ์ฒด)

โœจ ํŠน์ง•

  • Promise๋Š” ๋ฏธ๋ž˜์— ์™„๋ฃŒ๋  ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜(resolve)ํ•˜๊ฑฐ๋‚˜, ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜(reject)ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ .then()๊ณผ .catch()๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์„ฑ๊ณต ์‹œ์™€ ์‹คํŒจ ์‹œ์˜์ฒ˜๋ฆฌ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

โœ”๏ธ ์˜ˆ์ œ ์ฝ”๋“œ

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ๋ฌด์Šจ ๋ง์ธ์ง€ ๋ณด๋„๋กํ•˜์ฃ 
ํ•˜๋‹จ ์ฝ”๋“œ๋Š” Promise๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด hello๋ฅผ ์ž…๋ ฅ์‹œ
console์— ์ •์ƒ์ ์œผ๋กœ ์„ฑ๊ณต, ์‹คํŒจ ๋‚ด์šฉ์ด ๋ฐ˜ํ™˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์žํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

//Promise๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž(new)๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
const myPromise = new Promise((resolve, reject)=>{
  	//Promise ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์ธ์ž๋กœ call back ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  	//์ด๋Ÿฌํ•œ call back ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
   //์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ค˜~ ํ•˜๊ณ  ์•ฝ์†ํ•œ ๊ฒƒ ์ด์ฃ 
	//myPromise๋ฅผ ํ†ตํ•ด ์•ฝ์†์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
    setTimeout(()=>{
        const text = prompt(`"hello"๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์„ ๋ฌผ์„ ์ค„๊ป˜`);
        if(text === "hello"){
            resolve( '๐Ÿ’ป'); //์Šน์ธ
        }else{
            reject('error message') //์‹คํŒจ
        }
    }, 2000); //2์ดˆ ํ›„ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜
});

myPromise
    .then((result)=>{
        console.log('result',result);
    })
    .catch(()=>{
        console.log("err:", err);
    })
    .finally(()=>{
        console.log("finally");
    })

์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ด…์‹œ๋‹ค.

Promise ๊ฐ์ฒด ์ƒ์„ฑ์‹œ(์ƒ์„ฑ์ž new) ์ธ์ž๋กœ call back ํ•จ์ˆ˜๋ฅผ ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//myPromise๋ฅผ ํ†ตํ•ด ์•ฝ์†์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
const myPromise = new Promise(()=>{ 
  	//ํ•ด๋‹น ๊ณต๊ฐ„์—๋Š” callback(๋น„๋™๊ธฐ) ํ•จ์ˆ˜๋ฅผ ์ง‘์–ด ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
	//๊ทธ๋ž˜์„œ ์ƒ๋‹จ ์ฝ”๋“œ์—์„œ๋Š” setTimeout(๋น„๋™๊ธฐ)์ด ์‚ฌ์šฉ๋œ๊ฒƒ์ž…๋‹ˆ๋‹ค.
	}

์ด๋Ÿฌํ•œ call back ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ๋˜๋Š”๊ฒ๋‹ˆ๋‹ค.

์ฆ‰ "์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ค˜~" ํ•˜๊ณ  ์•ฝ์†(Promise)ํ•œ ๊ฒƒ ์ด์ฃ 

๋‘๋ฒˆ์งธ ํŠน์ง•์—์„œ

  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜(resolve)
  • ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜(reject)
    ์ด๋ ‡๊ฒŒ ์†Œ๊ฐœ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.
// Promise ๊ฐ์ฒด์˜ ์ƒ์„ฑ
const promise = new Promise((resolve, reject) => {// resolve, reject ์‚ฌ์šฉ์‹œ ์„ ์–ธ
  // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      setTimeout(()=>{
        const text = prompt(`"hello"๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์„ ๋ฌผ์„ ์ค„๊ป˜`);//prompt๋กœ ํ…์ŠคํŠธ ์ „๋‹ฌํ•ด์ค˜
        if(text === "hello"){
            resolve( '๐Ÿ’ป'); //์Šน์ธ์‹œ ์ถœ๋ ฅ
        }else{
            reject('error message') //์‹คํŒจ์‹œ ์ถœ๋ ฅ
        }
    }, 2000); //2์ดˆ ํ›„ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜
  }
});

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด setTimeout์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ฒŒ๋˜๊ณ 
prompt์— ์›ํ•˜๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

hello๋ฅผ ์ž…๋ ฅ์‹œ ๐Ÿ’ป์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ์ด๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฐ’์„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ”๏ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ

์ด๋•Œ Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต(fulfilled)ํ•˜์˜€๋Š”์ง€ ๋˜๋Š” ์‹คํŒจ(rejected)ํ•˜์˜€๋Š”์ง€ ๋“ฑ์˜ ์ƒํƒœ(state) ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

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

โœ”๏ธ Promise ํ˜ธ์ถœ ๊ณผ์ •

ํ•˜๋‹จ ๋ถ€๋ถ„์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์„๋•Œ
.then() , .catch()์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ์— callbackํ•จ์ˆ˜๋กœ ๋‹ด์•„์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

then()

๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์„ฑ๊ณตํ•˜๋ฉด resolve ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ resolve ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ ํ•˜๋Š”๋ฐ, ์ด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋Š” Promise ๊ฐ์ฒด์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค..

catch()

๋งŒ์•ฝ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•˜๋ฉด reject ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ reject ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” Promise ๊ฐ์ฒด์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ then(Promise ๋ฐ˜ํ™˜)๊ณผ catch(์˜ˆ์™ธ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

myPromise
    .then((result)=>{
        console.log('result',result);
    })
    .catch(()=>{
        console.log("err:", err);
    })
    .finally(()=>{
        console.log("finally");
    })

โœ”๏ธ Promise ์ฒด์ด๋‹

๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋•Œ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์ค‘์ฒฉ(nesting)์ด ๋˜์–ด ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ์ฝœ๋ฐฑ ํ—ฌ์ด ๋ฐœ์ƒํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค๋Š” ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์ธ then์ด๋‚˜ catch๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒด์ด๋‹(chainning)ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํ—ฌ์„ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, then ๋ฉ”์†Œ๋“œ๊ฐ€ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉด(then ๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.) ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜

์ง์ฝ”๋”ฉ ์œ ํŠœ๋ธŒ
velog_khy226
poiemaweb

profile
'๊ฐ™์ด์˜ ๊ฐ€์น˜๋ฅผ'

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