[๐Ÿฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ํ”„๋กœ๋ฏธ์Šค(Promise)

dsfasdยท2022๋…„ 9์›” 25์ผ
0

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

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

[ ๋น„๋™๊ธฐ ๊ด€๋ จ ํฌ์ŠคํŒ… ] https://velog.io/@bommy5799/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B9%84%EB%8F%99%EA%B8%B0-Asynchronous

Promise ์™€ async/await


1. Promise ์‚ฌ์šฉํ•˜๊ธฐ

Promise๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด

์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๋ฏธ์Šค ํŒจํ„ด ์‚ฌ์šฉ

โœ… ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์น˜ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
(์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ๋‹ค๋Š” '์•ฝ์†'(ํ”„๋กœ๋ฏธ์Šค)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.)

โœ… ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์€ ์œ ์šฉํ•˜์ง€๋งŒ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์žฆ์€ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€
๋ฐ€๋ฆฌ๋Š” ํ˜•ํƒœ์˜ callback HELL ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

โœ… ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ES6์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํŒจํ„ด์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค(Promise)๋ฅผ ๋„์ž…ํ–ˆ๋‹ค

< Promise >๋ฅผ ์ด์šฉํ•˜๋ฉด callback HELL ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Promise๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜๋ฉฐ, ์งœ์—ฌ์ง„ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅผ ๋ฟ์ด๋‹ค.
  • Promise ๋˜ํ•œ return์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Promise Hell ์ด ๋ฐœ์ƒํ•œ๋‹ค.


๐Ÿ—ฏ Promise ์˜ ์ƒํƒœ

Promise๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€์˜ ์ƒํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

  • ๋Œ€๊ธฐ(pending) : ์ดํ–‰ํ•˜์ง€๋„, ๊ฑฐ๋ถ€ํ•˜์ง€๋„ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ.
  • ์ดํ–‰(fulfilled): ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ.
  • ๊ฑฐ๋ถ€(rejected) : ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ.

๐Ÿ—ฏ Promise์˜ ์ž‘๋™ ์›๋ฆฌ

๐Ÿ‹ new Promise

  • Promise ๋Š” ํด๋ž˜์Šค์ฒ˜๋Ÿผ new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ ๋‹ค.
  • Promise์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋Š” "Pending"
let a = new Promise((resolve,reject) => {});
console.log(a)
>
//Promise {<pending>}
//	[[Prototype]]: Promise
//  [[PromiseState]]: "Pending"  //Promise์— 
//  [[PromiseResult]]: undefined

๐Ÿ‹ resolve( ), reject( )

  • Promise ๊ฐ์ฒด์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž์ฒด ์ œ๊ณตํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜ (resolve์™€ reject)๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
    (๊ผญ resolve, reject ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, reslove์™€ reject ์ˆœ์„œ๋งŒ ๋งž๊ฒŒ ๋Œ€์‘์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.)

  • ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰์˜ ์ฒ˜๋ฆฌ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„ฑ๊ณต์‹œ resolve() ๋ฐ˜ํ™˜, ์‹คํŒจ์‹œ reject() ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    โ—๏ธ( resolve์™€ reject๋Š” Promise๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ์•„๋‹Œ ์ฆ‰์‹œ ์‹คํ–‰์— ํ•ด๋‹นํ•œ๋‹ค. )

  • Promise๊ฐ€ resolve ๋˜๋Š” reject๋ฅผ ๊ฑฐ์นœ ์ƒํƒœ๋Š” "fulfilled" ํ˜น์€ "rejected"

resolve

let a = new Promise((resolve,reject) =>{
    resolve('hello')
});
console.log(a)

//Promise {<fulfilled>: 'hello'}
//	[[Prototype]]: Promise
//  [[PromiseState]]: "fulfilled"  //์ดํ–‰ ์ƒํƒœ 
//  [[PromiseResult]]: hello

reject

let b = new Promise((resolve,reject) =>{
    reject('bye')
});
console.log(b)

//Promise {<rejected>: 'bye'}
//	[[Prototype]]: Promise
//  [[PromiseState]]: "rejected"  //๊ฑฐ๋ถ€ ์ƒํƒœ 
//  [[PromiseResult]]: bye

๐Ÿ‹ then([callback]), catch([callback])

  • then(), catch()๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

then(callback)

  • then()์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • resolve( ) ๋ฐ˜ํ™˜ ์ดํ›„์— ์‹คํ–‰ ์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ
  • ์ธ์ž๋กœ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ค€๋‹ค.

catch(callback)

  • then()์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • reject( ) ๋ฐ˜ํ™˜ ํ›„ ์‹คํ–‰ ์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ
  • ์ธ์ž๋กœ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ค€๋‹ค.
  • then๊ณผ catch๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • a ๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ’์ด๋‹ค.
    • a.then( )์˜ ๊ฒฐ๊ณผ๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • a.then().then() ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • then(), catch()๋Š” ๋ฐ˜ํ™˜ ์ดํ›„ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
    a.then().then()์€ "hello" ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰ then์— ํ˜ธ์ถœ๋œ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์ธํ•ด "world!"๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • a.then().then()์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ธ์ž๋กœ ์ฃผ๋ฉด ๊ธฐ์กด ๋ฆฌํ„ด๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜์™€์˜ ์‘์šฉ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ‹ Promise Chaining

Promise๋ฅผ ํ†ตํ•ด then์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด ์ฒด์ธ์˜ ํ˜•ํƒœ๋ฅผ ๋ˆ๋‹ค๊ณ  ํ•ด์„œ ์ƒ๊ฒจ๋‚œ ์šฉ์–ด์ด๋‹ค.

printString("A")๊ฐ€ resolveํ†ตํ•ด promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด,
๊ทธ ์•„๋ž˜ .then(() => {return printString("B")}) ๊ตฌ๋ฌธ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

const printString = (string) => { 
  //Promise๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ resolve, reject๋ฅผ ์ค€๋‹ค.
  return new Promise((resolve,reject) => { 
  	setTimeout(
    	() => {
      	console.log(string)
      	resolve()  
    	},
    	Math.floor(Math.random() * 100)+1
  		)
	  })
     }
    
const printAll = () => {
    printString("A") //string๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ 
  
    .then(() => { //then()์œผ๋กœ ์ฒซ task๊ฐ€ ๋๋‚œ ํ›„ ๋‹ค์Œ task๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
     	return printString("B")
    })
    .then(() => {
      	return printString("C")
    })
  }
  
printAll()

๐Ÿ‹ [Promise ๊ด€๋ จ API] - Promise.all( )

Promise.all์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋Ÿผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Promise.all์€ ๋ฐฐ์—ด ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • Promise.all์€ ๋ฐฐ์—ด ์ธ์ž๋กœ ๋ฐ›์€ ์š”์†Œ๋“ค์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•œ๋‹ค.
    ( ๋”ฐ๋ผ์„œ task์˜ ์ˆœ์„œ๊ฐ€ ๊ณ ๋ ค๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉX )
  • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํƒœ์Šคํฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ์˜ ํ•ด๋‹น ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์€ ์ธ์ž๋กœ ๋‚˜๋ˆ ์„œ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ,
๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” then ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


2. async/await ์‚ฌ์šฉํ•˜๊ธฐ

โœ… ํ”„๋กœ๋ฏธ์Šค ํŒจํ„ด๋ณด๋‹ค ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด ES7์—์„œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• <async/await > ์ด ๋„์ž…๋˜์—ˆ๋‹ค.

๐Ÿฅ async function ์„ ์–ธ - ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์„ ์–ธ

  • ํ•จ์ˆ˜ ์•ž์— async ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•จ์œผ๋กœ์จ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฅ await

  • ์‚ฌ์šฉ:

    await์€ <Promise๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‚ค์›Œ๋“œ>๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
    ์ฒ˜๋ฆฌํ•  ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑ
async function(){
	await ํ•จ์ˆ˜()
}
  • ์ฃผ์˜ ์‚ฌํ•ญ :

    async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ฐ˜๋“œ์‹œ async ํ•จ์ˆ˜์˜ ์ง์ „ ๋‚ด๋ถ€์—์„œ๋งŒ ์“ฐ์—ฌ์•ผํ•œ๋‹ค)

  • ๋™์ž‘ ๋ฐฉ์‹ :

    async ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์ „๋‹ฌ ๋œ Promise์˜ ํ•ด๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ async ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ  ์™„๋ฃŒํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ์žฅ์  : ์ฝ”๋“œ ์ฝ๊ธฐ๊ฐ€ ์ˆ˜์›”ํ•˜๋‹ค.

    await ํ‚ค์›Œ๋“œ๋Š” ์ผ๋ฐ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ๋ฐ”๋กœ ์‹คํ–‰์ด ๋‹ค์Œ ๋ผ์ธ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— await ์ดํ›„์˜ ์ฝ”๋“œ๋“ค๋„ ์ผ๋ฐ˜ ๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋“ค์ฒ˜๋Ÿผ ์ญ‰ ์ฝ์–ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

๐Ÿฅ ์—๋Ÿฌ ์ฒ˜๋ฆฌ - Try Catch

  • async ์ฝ”๋“œ์—์„œ์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋Š” try catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

try catch ๊ตฌ๋ฌธ

try {
  nonExistentFunction();
} catch (error) {
  console.error(error);
  // expected output: ReferenceError: nonExistentFunction is not defined
  // Note - error messages will vary depending on browser
}

์˜ˆ์ œ

// ํ•จ์ˆ˜ ๋ถ€๋ถ„์€ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑ
const printString = (string) => {
  //Promise๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ resolve, reject๋ฅผ ์ค€๋‹ค.
  return new Promise((resolve,reject) => { 
  	setTimeout(
    	() => {
      	console.log(string)
      	resolve()  
    	},
    	Math.floor(Math.random() * 100)+1
  		)
	  })
     }

// ์‹คํ–‰ ์‹œํ‚ฌ ํ•จ์ˆ˜์— async ํ‚ค์›Œ๋“œ ์ž‘์„ฑ
//returnํ•  ํ•จ์ˆ˜ ๋ช…์— await ํ‚ค์›Œ๋“œ 
const printAll = async () => {
    await printString("A") 
    await printString("B")
    await printString("C") 
  }

printAll();

profile
๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„!

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