๐Ÿ“– [JavaScript] Promise

ํ˜ฑยท2022๋…„ 9์›” 10์ผ

JavaScript_Intermediate

๋ชฉ๋ก ๋ณด๊ธฐ
17/19

๐Ÿ”Ž Promise

๐Ÿ“Œ ์‚ฌ์šฉ๋ฒ•

const pr = new Promise((resolve, reject) => {
  //code
});

ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ, ์ธ์ˆ˜๋Š” resolve, reject์ž„
resolve: ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
reject: ์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
์–ด๋–ค ์ผ์ด ์™„๋ฃŒ๋œ ์ดํ›„ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜: Callback

๐Ÿ“Œ ์›๋ฆฌ

์ดˆ๊ธฐ ์ƒํƒœ

state: pending(๋Œ€๊ธฐ)
result: undefined

resolve(value)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด(์„ฑ๊ณต),
result๋Š” resolveํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๊ฐ’

state: fulfilled(์ดํ–‰๋จ)
result: value

reject(error)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด(์‹คํŒจ),
result๋Š” rejectํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์—๋Ÿฌ

state: rejected(๊ฑฐ๋ถ€๋จ)
result: error

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์‹œ(ํŒ๋งค์ž)

๐Ÿ”— ์„ฑ๊ณต ์˜ˆ์‹œ

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },3000)
});

์œ„ ์ƒํƒœ๋Š” ์„ฑ๊ณตํ•˜๋ฉด,

state: pending(๋Œ€๊ธฐ)
result: undefined

์—์„œ, 3์ดˆ ํ›„
state: fulfilled(์ดํ–‰๋จ)
result: 'OK'

๐Ÿ”— ์‹คํŒจ ์˜ˆ์‹œ

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
   reject(new Error('error'))
  },3000)
});

์œ„ ์ƒํƒœ๋Š” ์‹คํŒจํ•˜๋ฉด,

state: pending(๋Œ€๊ธฐ)
result: undefined

์—์„œ, 3์ดˆ ํ›„
state: rejected(๊ฑฐ๋ถ€๋จ)
result: error

ํŒ๋งค์ž๋Š” 3์ดˆ ๋™์•ˆ ์‹คํ–‰ํ•˜๊ณ  ์‹คํŒจ์ธ์ง€ ์„ฑ๊ณต์ธ์ง€ ์•Œ๋ ค์คŒ

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์‹œ(์†Œ๋น„์ž)

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },3000)
});

pr.then(
	function(result){}, //์ดํ–‰๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰, result='OK'
    function(err){} //๊ฑฐ๋ถ€๋˜์—ˆ์„ ๋•Œ, error์—๋Š” err์ด ๋“ค์–ด์˜ด
);

์ œ๋Œ€๋กœ ์ž‘์„ฑํ•˜๋ฉด,

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },3000)
});

pr.then(
	function(result){
    	console.log(result + '๊ฐ€์ง€๋Ÿฌ ๊ฐ€์ž');
    }, 
    function(err){
    	console.log('๋‹ค์‹œ ์ฃผ๋ฌธํ•ด์ฃผ์„ธ์š”');
    } 
);

โœ”๏ธ catch, finally: than ์ด์™ธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โ˜‘๏ธ catch: ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, reject์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },3000)
});

pr.then(
	function(result){}
    ).catch(
    function(err){}
);

๋‘๋ฒˆ์งธ๋กœ ์ „๋‹ฌํ–ˆ๋˜ ํ•จ์ˆ˜๋ฅผ catch ์•ˆ์œผ๋กœ ๋„ฃ์–ด์คŒ
๊ฐ€๋…์„ฑ๋„ ์ข‹๊ณ , ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜์—์„œ์˜ ์—๋Ÿฌ๋„ ์žก์•„์คŒ!

โ˜‘๏ธ finally: ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์‹คํ–‰

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },3000)
});

pr.then(
	function(result){}
 ).catch(
    function(err){}
 ).finally(
    function(){
        console.log('--์ฃผ๋ฌธ ๋--')
    }
);

๐Ÿ“Œ ์‹ค์ œ ์ฝ”๋“œ

๐Ÿ”— ์ดํ–‰

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK')
  },1000)
});

console.log('์‹œ์ž‘');
pr.then((result)=>{
  console.log(result);
})
  .catch((err) => {
  console.log(err);
})
  .finally(()=>
  console.log('๋');
});
//์‹œ์ž‘ (1์ดˆํ›„) OK ๋

๐Ÿ”— ๊ฑฐ๋ถ€

const pr = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(new Error('err'));
  },1000)
});

console.log('์‹œ์ž‘');
pr.then((result)=>{
  console.log(result);
})
  .catch((err) => {
  console.log(err);
})
  .finally(()=>
  console.log('๋');
});
//์‹œ์ž‘ (1์ดˆํ›„) err ๋

์ดํ–‰, ๊ฑฐ๋ถ€ ์ƒ๊ด€์—†์ด ๋์ด๋ผ๋Š” ๋ง์€ ํ•ญ์ƒ ๋œธ

๐Ÿ”— promise ์‚ฌ์šฉX

const f1 = (callback) => {
  setTimeout(function() {
    console.log('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
	callback();
  }, 1000);
};

const f2 = (callback) => {
  setTimeout(function() {
    console.log('2๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
	callback();
  }, 3000);
};

const f3 = (callback) => {
  setTimeout(function() {
    console.log('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
	callback();
  }, 2000);
};

console.log('์‹œ์ž‘')
f1(function(){
  f2(function(){
    f3(function(){
      console.log('๋');
    });
  });
});
>depth๊ฐ€ ๊นŠ์–ด์ง€๋ฉด์„œ callback์„ ๊ณ„์† ํ˜ธ์ถœํ•ด์•ผํ•จ.

๐Ÿ”— promise ์‚ฌ์šฉ

const f1= () => {
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 1000);
    });
  };
                     
const f2= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('2๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 3000);
    });
  };

const f3= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 2000);
    });
  };

console.log('์‹œ์ž‘');
f1()
  .then(res => f2(res))
  .then(res => f3(res))  
  .then(res => console.log(res));
  .catch(conole.log)
  .finally(()=>{
    console.log('๋');
  });

promise๊ฐ€ ์—ฐ๊ฒฐ, ์—ฐ๊ฒฐ~ ๋˜๋Š” ๊ฒƒ: Promise Chaining

๐Ÿ”— 2๋ฒˆ์ด ์‹คํŒจ

const f1= () => {
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 1000);
    });
  };
                     
const f2= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      rej('xxx');
          }, 3000);
    });
  };

const f3= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 2000);
    });
  };

console.log('์‹œ์ž‘');
f1()
  .then(res => f2(res))
  .then(res => f3(res))  
  .then(res => console.log(res));
  .catch(conole.log)
  .finally(()=>{
    console.log('๋');
  });

2๋ฒˆ์ด ์‹คํŒจ๋ผ๋ฉด, 3๋ฒˆ์€ ์‹คํ–‰๋ถ€ํ„ฐ ์•ˆํ•˜๊ณ , finally๊ฐ€ ์‹คํ–‰๋จ

โœ”๏ธ Promise.all

๋ชจ๋‘ ํ•œ๋ฒˆ์— ์‹คํ–‰
๋ฐฐ์—ด๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ํ•จ์ˆ˜ ์•ˆ์˜ ์ž‘์—…์ด ๋ชจ๋‘ ์‹คํ–‰๋˜์–ด์•ผ then์•ˆ์—๊ฐ€ ์‹คํ–‰๋จ
๋ชจ๋‘ ์ดํ–‰๋˜๋ฉด ๊ฐ’์ด ์‹คํ–‰๋จ
์‹œ๊ฐ„ ์ ˆ์•ฝ ๊ฐ€๋Šฅ!

const f1= () => {
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 1000);
    });
  };
                     
const f2= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      rej('xxx');
          }, 3000);
    });
  };

const f3= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 2000);
    });
  };

//Promise.all
Promise.all([f1(), f2(), f3()]).
  .then(res => {
    console.log(res);
    console.timeEnd('x'); // ๋Œ€๋žต ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ ธ๋Š” ์ง€ ๊ณ„์‚ฐ
  });
  
  //["1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ", "2๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ", "3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ"]

๐Ÿค” Promise.all ์‚ฌ์šฉ์‹œ, 2๋ฒˆ์ด reject๋ผ๋ฉด?

const f1= () => {
 return new Promise((res, rej) => {
   setTimeout(()=>{
     res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
         }, 1000);
   });
 };
                    
const f2= (message) => {
 console.log(message);
 return new Promise((res, rej) => {
   setTimeout(()=>{
     rej('xxx');
         }, 3000);
   });
 };

const f3= (message) => {
 console.log(message);
 return new Promise((res, rej) => {
   setTimeout(()=>{
     res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
         }, 2000);
   });
 };

Promise.all([f1(), f2(), f3()]).
 .then(res => {
   console.log(res);
 });

๐Ÿง ์–ด๋–ค ๊ฐ’๋„ ์–ป์ง€ ๋ชปํ•จ...!
ํ•˜๋‚˜์˜ ์ •๋ณด๋ผ๋„ ๋ˆ„๋ฝ๋˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Œ
์ฆ‰, ๋‹ค ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์•„์˜ˆ ์•ˆ ๋ณด์—ฌ์ค„ ๋•Œ ์‚ฌ์šฉ

โœ”๏ธ Promise.race

Promise.all๊ณผ ๋™์ผ,
race๋Š” ํ•˜๋‚˜๋ผ๋„ ์ผ๋“ฑ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๋๋ƒ„

const f1= () => {
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 1000);
    });
  };
                     
const f2= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      rej('xxx');
          }, 3000);
    });
  };

const f3= (message) => {
  console.log(message);
  return new Promise((res, rej) => {
    setTimeout(()=>{
      res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
          }, 2000);
    });
  };

//Promise.race
Promise.race([f1(), f2(), f3()]).
  .then(res => {
    console.log(res);
    console.timeEnd('x'); // ๋Œ€๋žต ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ ธ๋Š” ์ง€ ๊ณ„์‚ฐ
  });
  
  //"1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ"

๐Ÿค” Promise.race ์‚ฌ์šฉ์‹œ, 2๋ฒˆ์ด reject๋ผ๋ฉด?

๐Ÿง 2๋ฒˆ์ด reject๋ผ๊ณ  ํ–ˆ์ง€๋งŒ, ์ด๋ฏธ 1๋ฒˆ์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฌด์‹œ
์šฉ๋Ÿ‰์ด ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋”ฉํ•˜๋Š”๋ฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ ์‚ฌ์šฉ

const f1= () => {
return new Promise((res, rej) => {
  setTimeout(()=>{
    res('1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
        }, 1000);
  });
};
                   
const f2= (message) => {
console.log(message);
return new Promise((res, rej) => {
  setTimeout(()=>{
    rej('xxx');
        }, 3000);
  });
};

const f3= (message) => {
console.log(message);
return new Promise((res, rej) => {
  setTimeout(()=>{
    res('3๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ);
        }, 2000);
  });
};
//Promise.race
Promise.race([f1(), f2(), f3()]).
.then(res => {
  console.log(res);
  console.timeEnd('x'); // ๋Œ€๋žต ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ ธ๋Š” ์ง€ ๊ณ„์‚ฐ
});

//"1๋ฒˆ ์ฃผ๋ฌธ ์™„๋ฃŒ"
profile
new blog: https://hae0-02ni.tistory.com/

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