[ 06.22 ] Promise / async, await

์ด์ˆ™์˜ยท2021๋…„ 6์›” 22์ผ
0

Java Script

๋ชฉ๋ก ๋ณด๊ธฐ
18/20
post-thumbnail

Achievement Goals

๐ŸŽ synchronous / asynchronous
๐ŸŽ Promise ์‚ฌ์šฉ ํŒจํ„ด์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
-resolve, reject์˜ ์˜๋ฏธ์™€, then, catch์™€์˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
-Promise์—์„œ ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
-Promise์˜ ์„ธ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
-Promise.all ์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
๐ŸŽ async/await keyword์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ , ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋™๊ธฐ(synchronous) ๋น„๋™๊ธฐ(asynchronous)

์ปดํ“จํ„ฐ์—์„œ์˜ ๋™๊ธฐ์  ๋ฐฉ์‹์ด๋ž€, ์–ด๋– ํ•œ ๋™์ž‘์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ๋™์ž‘์€ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ์ƒํƒœ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์›น/์•ฑ ์„œ๋ฒ„๋Š” ๋น„๋™๊ธฐ์  ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๋Š”๋ฐ, ์–ด๋– ํ•œ ๋™์ž‘์ด ๋๋‚˜์ง€ ์•Š๋”๋ผ๋„ ๋’ค์—์žˆ๋Š” ๋™์ž‘์€ ์•Œ์•„์„œ ์‹œ์ž‘์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ์–ด๋– ํ•œ ์˜์ƒ์„ ์‹œ์ฒญํ•  ๋•Œ ๋กœ๋”ฉ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ๊ฒƒ๋“ค์„ ํด๋ฆญํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋™์˜์ƒ์ด ๋กœ๋”ฉ์ค‘์— ์žˆ์–ด๋„ ๋‹ค๋ฅธ ์˜์ƒ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”๊ฒƒ. ์ด ๋ชจ๋“ ๊ฒƒ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ฒƒ์ด๋‹ค.

2.Promise

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์‹ค ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ•˜๊ธฐ ์ „์—, ์ฝœ๋ฐฑ์˜ ๊ฐœ๋…์„ ๋จผ์ € ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ
์ฝœ๋ฐฑ์€ ๊ทธ๋™์•ˆ ํ•จ์ˆ˜์—์„œ ์ž์ฃผ ๋‹ค๋ค˜๋˜ ๊ฐœ๋…์ด๋‹ค. ๊ณ„์†์ ์œผ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ๋‚ด๋Š” ์ฝœ๋ฐฑ์œผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ํ‘œํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ, ๋ถˆ๋Ÿฌ์˜ฌ ํ•จ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋˜๋ฉฐ "์ฝœ๋ฐฑ์ง€์˜ฅ" ์ด๋ผ๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

promise ๋Š” ์ด ์ฝœ๋ฐฑ์ง€์˜ฅ์„ ๋ฒ—์–ด๋‚˜ ์ข€ ๋” ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
ํ•จ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” promise๋Š” ํด๋ž˜์Šค์ฒ˜๋Ÿผ new ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

new Promise((resolve,reject)=>{~~})

๐Ÿค™๐Ÿผ resolveโค๏ธ.then / rejectโค๏ธ.catch

๋งŒ์•ฝ ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ์„œ๋ฒ„๋ฅผ ๋ฐ›์•„ ์˜ฌ ๋•Œ, ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ›์•„์˜ค๋ฉด resolve์— ์žˆ๋Š” ๋™์ž‘์ด ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.
๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ ๋ฐ›๋Š”๋ฐ ์‹คํŒจ๋ฅผ ํ•œ๋‹ค๋ฉด reject ์— ์žˆ๋Š” err ๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
๋‚˜๋Š” ๋จธ๋ฆฌ๊ฐ€ ๋‚˜๋น ์„œ ,,
resolve - then ์ง๊ฟ, reject - catch ์ง๊ฟ ์ด๋ ‡๊ฒŒ ์™ธ์›Œ๋ฒ„๋ ธ๋‹ค.

๐Ÿค™๐Ÿผ Promise์˜ ์„ธ๊ฐ€์ง€ ์ƒํƒœ

new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ 3๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค.

Pending(๋Œ€๊ธฐ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
Fulfilled(์ดํ–‰) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€ ์ƒํƒœ
Rejected(์‹คํŒจ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ


์œ„์˜ ๊ทธ๋ฆผ์€ resolve, reject ์—†์ด Promise ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ๋‹ค.
๋กœ์ง์™„๋ฃŒ๊ฐ€ ๋œ ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์ด๋ผ๊ณ  ์จ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function myPromise(){
 return new Promise((resolve,reject)=>{
     setTimeout((
       resolve('๐Ÿ‘…')
     ),2000)
  })
}

resolve, reject ๋ฅผ ์ผ์„ ๊ฒฝ์šฐ status ๋Š” fulfilled ๋กœ ๋‚˜์˜ค๋ฉฐ, ์ด ํ˜•ํƒœ๋ฅผ ์ •์ƒ์ ์ธ ํ˜•ํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์˜ˆ์‹œ

 function myPromise(str){
   return new Promise((resolve,reject)=>{
     setTimeout(() => {
        console.log(str)
        resolve()
     }, Math.floor(Math.random()*100)+1
    )
  })
}
  
  const resultFace = () =>{
  myPromise('๐Ÿ‘€')
  .then(()=>{myPromise('๐Ÿ‘ƒ๐Ÿผ')})
  .then(()=>{myPromise('๐Ÿ‘„')})
}

str ์ด๋ผ๋Š” ์ธ์ž๋ฅผ ๊ฐ–๋Š” myPromise ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
์ด ํ•จ์ˆ˜์•ˆ์— ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹œ๊ฐ„์ด ๋žœ๋ค์ธ ms ๋ฅผ ์ž‘์„ฑ.

ํ”„๋กœ๋ฏธ์Šค๋กœ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์„ ์‹œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋„ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.
resultFace ๋ผ๋Š” ,, ๋ญ”๊ฐ€ ์–ด๊ฐ์ด ์ด์ƒํ•˜์ง€๋งŒใ…‹ใ…‹ใ…‹
์—ฌํŠผ ์ด ํ•จ์ˆ˜์•ˆ์— myPromise ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ธ์ž๋กœ ๋‚ด๊ฐ€ ๋„ฃ๊ณ ์‹ถ์€ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.


์–ด๋•Œ์œ  ๋‚ด์–ผ๊ตด? ใ…‹ใ…Žใ…‹ใ…Ž

ํ•˜์ง€๋งŒ ์ฝœ๋ฐฑ์ง€์˜ฅ์„ ๋ฒ—์–ด๋‚œ promise ๋„ ํ•จ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ, ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค ์ง€์˜ฅ์„ ๋ง›๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋•Œ Promise Chaining ์„ ์‹œ์ผœ์ฃผ๋ฉด ๋ณด๋‹ค ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

let result = [];
return prom1
.then(data => {
  result.push(JSON.parse(data))
  return prom2
})
.then(data =>{
  result.push(JSON.parse(data))
  return prom3;
})
.then(data =>{
  result.push(JSON.parse(data))
  return prom4;
})
.then(data =>{
  result.push(JSON.parse(data))
  return result;
})

๐Ÿค™๐Ÿผ Promise.all

๊ทธ๋ž˜๋„ ๋ณต์žกํ•ด๋ณด์ธ๋‹ค๊ณ ?
๊ทธ๋Ÿด๋• ๋น„๋™๊ธฐ ์‹คํ–‰ ํ•  ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ชจ๋‘ ๋ฌถ์–ด์ฃผ๋Š”, Promise.all ์จ๋ณด์ž!
Promise.all ์€ ๋ฐฐ์—ดํ˜•ํƒœ์˜ ์ธ์ž, ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๊ฐ€ ์˜จ๋‹ค.
์‹ ๊ธฐํ•œ ์ ์€ (์‚ฌ์‹ค ๋‚˜๋งŒ ์‹ ๊ธฐํ•œ๋“ฏ.)

-์ถœ์ฒ˜ : ๋ชจ๋‘์˜ ๊ฐ“ mdn ,,
mdn ์—์„œ Promise.all์˜ ์ธ์ž์— ํ•จ์ˆ˜์ด๋ฆ„์„ ๋•…๋•…๋•… ๋„ฃ๊ณ  ๋งˆ์ง€๋ง‰์— .then ์„ ๋„ฃ์–ด์ฃผ์–ด ๊ธฐ์กด์— ์žˆ๋Š” ํ•จ์ˆ˜์ด๋ฆ„๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ธ์ž ์•ˆ์—์„œ๋„ then ์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค!!

  const readAllUsers = () => {
  const prom1 = getDataFromFilePromise(user1Path);
  const prom2 = getDataFromFilePromise(user2Path);
  
  return Promise.all([
    prom1.then(data=>JSON.parse(data)),
    prom2.then(data=>JSON.parse(data))    
  ])
  .then((data)=>{
    return data;
  })
}
  
  ๋˜๋Š” 
  
  const readAllUsers = () => {
  const prom1 = getDataFromFilePromise(user1Path);
  const prom2 = getDataFromFilePromise(user2Path);
  
  return Promise.all([prom1,prom2])
  .then(([data1,data2])=>{
    return `[${data1},${data2}]`
  })
  .then((data)=>{
    return JSON.parse(data);
  })
}

๋‹จ, promise.all ์€ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ reject ๋˜๋ฉด ๋‚˜๋จธ์ง€๋„ ๋‹ค ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

3. async/await

hoxy ,, promise ๋„ ๋ˆˆ์— ์•ˆ๋“ค์–ด์˜ค์‹ ๋‹ค๊ณ ์šง?
๊ทธ๋ ‡๋‹ค๋ฉด async ๋ฅผ ๊ณ ๋ คํ•ด๋ด๋„ ์ข‹๋‹ค.
๋ฌด์กฐ๊ฑด async ๋ฅผ ์“ฐ๋Š”๊ฒƒ์ด ์ข‹์€๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ํ•˜๋‚˜ ์•„์ง ์ •ํ™•ํ•œ ์ฐจ์ด๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ์ง€ ,,

ํ˜•ํƒœ

async function myAsync(){
return await ๋น„๋™๊ธฐํ•จ์ˆ˜๋ช….then(~~)
}
๋˜๋Š”
const myAsync = async () =>{
return await ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ช….then(~)
}

async ๋Š” await ์™€ ๊ฐ™์ด ์“ฐ์ด๋Š” ํ•œ ์„ธํŠธ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

์†Œ์˜ฌ์งใ…Ž .. ์กธ๋ฆฝ๋‹ค.
์ด๋งŒ ์ž๋Ÿฌ๊ฐˆ๊ฒŒ์š” ํœ˜๋ฆฌ๋ฆญ~

profile
FrontEndDeveloper

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด