์œคํƒœํ’ 2021. 2. 24. 21:26

๐Ÿ’ Promise

  • ํ”„๋กœ๋ฏธ์Šค๋Š” JS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” object.

  • ํ”„๋กœ๋ฏธ์Šค๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ ์ •์ƒ๋™์ž‘์‹œ ์„ฑ๊ณต๋ฉ”์„ธ์ง€ + ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๊ฐ’ ์ „๋‹ฌ// ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ์‹œ error์ „๋‹ฌ

  • State: pending(๋ณด๋ฅ˜) → fulfilled(์„ฑ๊ณต์ ์ธ ์™„๋ฃŒ) or rejected(๊ฑฐ๋ถ€)

  • Promise์˜ object์ธ Produce vs Consumer

1. Producer (์ƒ์‚ฐ์ž)

  • ํ”„๋กœ๋ฏธ์Šค๋Š” ํด๋ž˜์Šค์—ฌ์„œ new๋ผ๋Š” ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑ๊ฐ€๋Šฅ
  • ํ”„๋กœ๋ฏธ์Šค๋Š” executor ๋ž€ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ „๋‹ฌํ•ด์ค˜์•ผํ•˜๋ฉฐ ์ด๊ฒƒ์€ ๋‘๊ฐ€์ง€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ(resolve, reject) ๋‹ค์‹œ๋ฐ›์Œ
  • ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ๊ฐ„ executor๋ž€ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋ฐ”๋กœ ์‹คํ–‰
const promise = new Promise((resolve, reject)=>{
    
    //doing some heavy work(network, read files) 
    // => ๋™๊ธฐ์ ์ด๋ผ๋ฉด ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ ์‹œ๊ฐ„ ๋„ˆ๋ฌด ์“ฐ๋‹ˆ๊นŒ ๋น„๋™๊ธฐ์  ์ถ”์ฒœ
    
    console.log('doing something...');
    setTimeout(()=>{     
        resolve('dada');                   // ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ–ˆ์„๋•Œ resolve์— ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•ด์„œ ํ˜ธ์ถœ
        //reject(new Error('no network')); // Error๋ฐœ์ƒํ–ˆ์„๊ฒฝ์šฐ
    },2000)
    
}); // -> ์‚ฌ์šฉ์ž๊ฐ€ ์š”๊ตฌํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๋Š” ๋ถˆํ•„์š”ํ•œ ํ†ต์‹ ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Œ

 

2. Consumer (์†Œ๋น„์ž)

  • then, catch, finally๋ฅผ ํ†ตํ•ด์„œ ๊ฐ’์„ ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • promise object ๋งŒ๋“ค๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ๋“ค์„ ์•ˆ์— ์ ์–ด์ค€ ํ›„ ์„ฑ๊ณต์ ์ด๋ฉด resolveํ˜ธ์ถœ ์‹คํŒจ๋ฉด reject(์ด์œ )ํ˜ธ์ถœ
  • ๊ทธ ํ›„ ์ด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•ด์„œ then, catch๋กœ ์„ฑ๊ณต๊ฐ’, ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์™€์„œ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
promise
.then((value)=>{             //์ด๋•Œ value๋Š” resolve๊ฐ€ ์ „๋‹ฌํ•œ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค.
    console.log(value);
}) 
.catch(error =>{             //์ด๋•Œ๋Š” reject์˜ ์ „๋‹ฌํ•ด์ค€ ์—๋Ÿฌ ์ „๋‹ฌ
    console.log(error);
});
.finally(()=>{               //finally๋Š” ์„ฑ๊ณต์‹คํŒจ ์—ฌ๋ถ€ ์ƒ๊ด€์—†์ด ๋งˆ์ง€๋ง‰์— ๊ธฐ๋Šฅ ์ˆ˜ํ–‰
    console.log('finally'); 
})
// => chaining ์ด์šฉ

3. Promise chaining(์—ฐ๊ฒฐํ•˜๊ธฐ)

  • then์—์„  ๊ฐ’์„ ๋ฐ”๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ๋ฆฌํ„ด์œผ๋กœ Promise๋ฅผ ์ „๋‹ฌํ•ด๋„ ๋œ๋‹ค.
const fetchNumber = new Promise((resolve,reject)=>{
    setTimeout(()=> resolve(1),1000);
});

fetchNumber
.then(num => num*2)                             // 2์ „๋‹ฌ (1*2)
.then(num => num*3)                             // 6์ „๋‹ฌ (2*3)
.then(num => {
    return new Promise((resolve,reject)=>{
        setTimeout(()=>resolve(num-1),1000);    // 5์ „๋‹ฌ (6-1)
    });
})
.then(num => console.log(num));                 // ์ถœ๋ ฅ์‹œ ์•ฝ 2์ดˆ์†Œ์š” (์œ„์˜ 1000 ๋ฐ‘์˜ 1000)

 

4. Error handling

  • catch ๋กœ error๋ฅผ ํ—จ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค
  • error๊ฐ€ ๋ฐœํ–‰ํ•ด๋„ catch๋ฅผ ์ด์šฉํ•˜๋ฉด ์ „์ฒด์ ์ธ Promise ์ฒด์ธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋นต๊พธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
const getHen = () =>
    new Promise((resolve,reject)=>{
        setTimeout(()=> resolve('๐Ÿ”'),2000);
    });
const getEgg= hen =>
    new Promise((resolve, reject)=>{
        setTimeout(()=> resolve(`${hen} => ๐Ÿฅš`),1000); 
    });
const cook = egg =>
    new Promise((resolve, reject)=>{
        setTimeout(()=> resolve(`${egg} => ๐Ÿณ`),2000);
    })

getHen()
.then(hen => getEgg(hen))           //hen: ๐Ÿ”
.catch(error =>{                    //catch๊ฐ€ ๋ฐ”๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌํ•ด์„œ ์ฒด์ธ์ด ๋นต๊พธ๋‚˜์ง€ ์•Š๊ฒŒ ๋Œ€์ฒดํ•ด์คŒ
    return '๐Ÿฅจ';
})      
.then(cook)                        //! ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ „๋‹ฌ์‹œ ๋ฐ›์•„์˜ค๋Š” ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์— ํ•˜๋‚˜ ๋„ฃ๋Š”๊ฒฝ์šฐ๋Š” ์ƒ๋žตO
.then(meal => console.log(meal))   
.catch(console.log);

then์—์„œ ๋ฐ›์•„์˜ค๋Š” value๋ฅผ ๋ฐ”๋กœ cook์ด๋ผ๋Š” ํ•จ์ˆ˜๋กœ ์•”๋ฌต์  ์ „๋‹ฌ (ํ•˜๋‚˜๋งŒ ๋ฐ”๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ ์ƒ๋žตํ•ด์„œ ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅํ•จ)