๐Ÿ‡ Javascript async/await

์ „์ฃผ์€ยท2022๋…„ 11์›” 16์ผ
1

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
4/5
post-thumbnail

๐Ÿ‡ javascript async/await

โœ” ๋“ค์–ด๊ฐ€๋ฉด์„œ..

์ €๋ฒˆ์‹œ๊ฐ„์— ๋ฐฐ์šด Promise์— ์ด์–ด ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฌธ๋ฒ•์ธ async/await์— ๋Œ€ํ•ด์„œ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. Promise์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!
JavaScript promise object

โœ” async/ await ์‚ฌ์šฉ๋ฒ•

  • ES7(2017)์— ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ• ์ž…๋‹ˆ๋‹ค.
  • callback, Pormise ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐํ•จ์ˆ˜ ์•ž์— async๋ฅผ ๋ถ™์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • await๋Š” async๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋  ์ „์ฒด ํ•จ์ˆ˜์•ž์— async๋ฅผ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
    async function ํ•จ์ˆ˜๋ช…(){
      ...            
    }
  2. ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด๋ฐ›๋Š” ํ•จ์ˆ˜ ์•ž์— await๋ฅผ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
    sync function ํ•จ์ˆ˜๋ช…(){
      ๋ณ€์ˆ˜๋ช… = await ํ•จ์ˆ˜๋ช…();
      ...
    }           
    โ— await ํ‚ค์›Œ๋“œ๋Š” async ํ•จ์ˆ˜์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
    โ— ๋งŒ์•ฝ Promise๊ฐ€ await์— ๋„˜๊ฒจ์ง€๋ฉด, await์€ Promise๊ฐ€ fulfill๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ํ•ด๋‹น ๊ฐ’์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
    โ— async ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ๋ช…์‹œ์ ์œผ๋กœ promise๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์•”๋ฌต์ ์œผ๋กœ promise๋กœ ๊ฐ์‹ธ์ง‘๋‹ˆ๋‹ค.

โœ” async/ await ๊ธฐ๋ณธ ์˜ˆ์ œ

์ž!! ํ•œ๋ฒˆ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? ์—ฌ๊ธฐ setTimeout์„ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋‘๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.

function getApple(){
    setTimeout(()=>{
        console.log('๐ŸŽ')
    },3000);
}
function getBanana(){
    setTimeout(()=>{
        console.log('๐ŸŒ')
    },1000);
}
getApple();
getBanana();
//console
//๐ŸŒ 1์ดˆ
//๐ŸŽ 1+2์ดˆ=3์ดˆ

๋‹ค๋“ค ์˜ˆ์ƒํ•œ ๊ฒฐ๊ณผ๊ฒ ์ฃ ? banana๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. getAppleํ•จ์ˆ˜๊ฐ€ ์•ž์— ์žˆ๋”๋ผ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฉด์„œ delay์‹œ๊ฐ„์ด ๋” ์งง์€ ๋ฐ”๋‚˜๋‚˜๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ, ๊ผญ ์‚ฌ๊ณผ๊ฐ€ ๋จผ์ € ๋„์ฐฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์ธ promise๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์ฃ ? ์ผ๋‹จ ๊ทธ๋ฐฉ์‹์„ ์ด์šฉํ•ด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค!

//promise ์ ์šฉ ํ›„
function getApple(){
    return new Promise((resolve) => {
        setTimeout(()=>{
            resolve('๐ŸŽ');
        },3000);
    })
}

function getBanana(){
    return new Promise((resolve) => {
        setTimeout(()=>{
            resolve('๐ŸŒ');
        },1000);
    })
}
//-------------์ˆ˜์ •ํ•  ๋ถ€๋ถ„โฌ‡
getApple()
    .then((apple)=>{console.log(apple)})
    .then(()=>{getBanana()
        .then((banana)=>{console.log(banana)})})
//console์ฐฝ 4์ดˆํ›„ ์ถœ๋ ฅ
//๐ŸŽ 3์ดˆ
//๐ŸŒ 3์ดˆ+1์ดˆ

promise๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ! ์ฆ‰, ๋™๊ธฐํ™”ํ•ด์ค€ ์ƒํƒœ๋ผ๊ณ  ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. getAppleํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚œ ํ›„ ๋ฆฌํ„ด๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ getBananaํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฆฌํ„ด๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋‹ˆ ์œ„์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ, async๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

//async ์ ์šฉ ํ›„
//-------------์ˆ˜์ •๋œ ๋ถ€๋ถ„โฌ‡
async function fetchFruits(){
    const apple = await getApple();
    console.log(apple);
    const banana = await getBanana(); 
    console.log(banana);
    return [apple, banana] 
}
fetchFruits().then((fruits) => console.log(fruits));
//console
//๐ŸŽ 3์ดˆ
//๐ŸŒ 3์ดˆ+1์ดˆ
//[ '๐ŸŽ', '๐ŸŒ' ] 3์ดˆ+1์ดˆ ๋ฐ”๋‚˜๋‚˜ ์ถœ๋ ฅํ›„ ๋ฐ”๋กœ

์ด์™€๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๋Š๋‚Œ์„ ์ค๋‹ˆ๋‹ค!
์ฝ”๋“œ๊ฐ€ ์งง์•„์„œ ์ฒด๊ฐ์ด ์•ˆ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ .then().then() ... .then().catch()์œผ๋กœ ๊ธธ๊ฒŒ ๋Š˜์—ฌ์ง„๋‹ค๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค๋ฌด์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๋ฐ›๊ณ ๋‚˜์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋ฆฌํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๊ฐ€์‹œํ™”ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค!


MDN
๋ฅ˜์ •์›๊ฐ•์‚ฌ๋‹˜ ๊ฐ•์˜์ž๋ฃŒ

profile
๋” ๋ฉ€๋ฆฌ ๋ณด๋„๋ก ํ•ด์š”. ์ง„์ฃผ๋Š” ํ•˜๋ฃจ์•„์นจ์— ์ƒ๊ฒจ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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