[JavaScript] Promise ๊ธฐ์ดˆ๐Ÿค

Promise ๐Ÿค

JavaScript์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์ฝœ๋ฐฑ ์ค‘์ฒฉ์ด ๋งŽ์•„์ง€๊ณ 

๊ทธ ๊ฒฐ๊ณผ, ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋†’์ด๋Š” ์ฝœ๋ฐฑ ์ง€์˜ฅ ๐Ÿ˜ˆ์„ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

a(function (resultA){
    b(resultA,function (resultB){
        c(resultB,function(resultC){
            d(resultC,function(resultD){
                e(resultD,function(resultE){
                    f(resultE,function(resultF){
                        console.log(resultF);
                    })
                })
            })
        })
    })
});

Promise ๊ธฐ์ดˆ

์ด๋Ÿฐ ์ƒํ™ฉ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด Promise ๋ผ๋Š” ํŒจํ„ด์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
JavaScript์—์„œ Promise๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๊ฒฐ๊ณผ(์„ฑ๊ณต or ์‹คํŒจ)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋‹จ์–ด์˜ ๋œป ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ
"๋ฉ”์†Œ๋“œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด๊ฒŒ, ์•ฝ์†ํ• ๊ฒŒ"
๋ผ๋Š” ๋œป์œผ๋กœ Promise๊ฐ€ ์•„๋‹Œ๊ฐ€๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค..? ๐Ÿคทโ€โ™‚๏ธ

๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒดํ™” ์‹œํ‚จ๋‹ค๋Š” ์ ์ด Promise์˜ ํŠน์ง•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise ์˜ˆ์ œ

var ranTime = function (){
    return new Promise(
      // ์‹คํ–‰ ํ•จ์ˆ˜ (Executor)
      function(resolve, reject){
        setTimeout(() => {
            var ran = Math.random() * 10;
            if(ran >= 5){
                resolve(ran);
            }else{
                reject("์‹คํŒจ!");
            }
        }, 1000);
    })
}

ranTime()
.then(function(num){
	// ์„ฑ๊ณต์‹œ
    console.log(num);
},function(text){
	// ์‹คํŒจ์‹œ
    console.log(text);
});

์œ„ Promise ์„ ์–ธ๋ถ€์—์„œ Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Promise ๊ฐ์ฒด๋Š” ์ธ์ž๋กœ ์‹คํ–‰ ํ•จ์ˆ˜(Executor)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ํ•จ์ˆ˜(Executor)๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด

  • ์„ฑ๊ณต > resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ > reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Promise ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต or ์‹คํŒจํ•˜์˜€๋Š”์ง€ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ฝ˜์†” ์ฐฝ์— ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด
setTimeout ํ•จ์ˆ˜๋กœ ์ธํ•ด pending์ด 1์ดˆ ๋™์•ˆ ์œ ์ง€ ํ›„
์œ„ ๊ฒฐ๊ณผ ๊ฐ’์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Promise ์ƒํƒœ

then ๋ฉ”์†Œ๋“œ

ranTime()
.then(function(num){
	//์„ฑ๊ณต์‹œ
    console.log(num);
},function(text){
	//์‹คํŒจ์‹œ
    console.log(text);
});

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

Promise Chaining

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ’์„ ์ด์–ด ๋ฐ›๋Š” then ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ
chaining์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Promise.then(function(a){

}).then(function(b){

}).then(function(c){

}).then(function(d){

}).then(function(e){

}).then(function(f){
    console.log();
})

์œ„์™€ ๊ฐ™์ด ์ฝœ๋ฐฑ ์ง€์˜ฅ๋ณด๋‹ค ํ›จ์”ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ๋“ค์–ด์„œ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ Promise์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ
async & await ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ํŒจํ„ด์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ