JavaScript Visualized: โญ๏ธ๐ŸŽ€ Promises & Async/Await

Posted on September 03, 2020ย  - ย 10 min read

reference: https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke

JavaScript ์ฝ”๋“œ๋ฅผ ๋‹ค๋ค„๋ณด์…”์•ผ ํ–ˆ๋˜ ์ ์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ์˜ˆ์ƒ๋Œ€๋กœ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‚˜์š”? ์•„๋งˆ ํ•จ์ˆ˜๋“ค์ด ์ž„์˜๋กœ ์˜ˆ์ƒ ๋ชปํ•œ ์‹œ์ ์ด๋‚˜ ์ง€์—ฐ๋˜์„œ ์‹คํ–‰๋œ ์ ์ด ์žˆ์ฃ . ES6์—๋Š” ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์œ„ํ•œ ์•„์ฃผ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์†Œ๊ฐœ ๋์Šต๋‹ˆ๋‹ค: Promise์ฃ !

๋ช‡ ๋…„ ์ „์˜ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ๋“ค์ด ์žˆ์—ˆ๊ณ  ์ž ์ด ์•ˆ ์˜ค๊ธธ๋ž˜ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. Promise์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด์ฃ : ์™œ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฑธ ์จ์•ผํ•˜๊ณ , ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ์š”. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์— ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๋ชจ๋˜ํ•œ ๋ฐฉ๋ฒ•์€ ๋ญ˜๊นŒ์š”?

๋งŒ์•ฝ ์ด์ „์— ์ž‘์„ฑํ•œ JavaScript Event Loop ํฌ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ฝ์–ด๋ณด์‹œ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ฝœ ์Šคํƒ, Web API์™€ Queue์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์‹์„ ์ „์ œ๋กœ ์ž‘์„ฑ๋๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ๊ฝค ํฅ๋ฏธ๋กœ์šด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค๋ค„๋ณผ๊ฑฐ์˜ˆ์š”! ๐Ÿคฉ

๐Ÿ”—โœจโ™ป๏ธJavaScript Visualized: Event Loop


์†Œ๊ฐœ

JavaScript๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์šฐ๋ฆฐ ์ข…์ข… ๋‹ค๋ฅธ ์ž‘์—…์— ์˜์กด๋Š” ์ž‘์—…์„ ๋‹ค๋ค„์•ผํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›๊ณ , ์••์ถ•ํ•˜๊ณ , ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ด์„œ ์ €์žฅํ•ด์•ผ๋˜๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ฃ  ๐Ÿ“ธ

๊ฐ€์žฅ ์ฒ˜์Œ ํ•ด์•ผํ•  ๊ฑด ํŽธ์ง‘ํ•  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒ๋‹ˆ๋‹ค. getImage ํ•จ์ˆ˜๊ฐ€ ์ด๊ฑธ ๋‹ด๋‹นํ•˜์ฃ ! ์ด๋ฏธ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ๋‚˜์„œ์•ผ์ง€๋งŒ, resizeImage ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ฆˆ ํ•˜๊ณ ๋‚˜๋ฉด, ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ applyFilter๋กœ ๋ณด๋‚ด์ฃ . ์ด๋ฏธ์ง€๊ฐ€ ์••์ถ• ๋˜๊ณ  ํ•„ํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ํ›„์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋๋‹ค๊ณ  ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค!

๋์— ๊ฐ€๋ฉด, ์ด๋Ÿฐ ์‹์œผ๋กœ ์™„์„ฑ์ด ๋  ๊ฒ๋‹ˆ๋‹ค:

promises and async await 1

ํ ..์—ฌ๊ธฐ์—์„œ ๋ˆˆ ์—ฌ๊ฒจ ๋ณผ๋งŒํ•œ ๊ฒŒ ์žˆ๋‚˜์š”? ๊ดœ์ฐฎ์€ ํŽธ์ด์ง€๋งŒ ํ›Œ๋ฅญํ•˜์ง„ ์•Š์ฃ . ์ด์ „ ์ฝœ๋ฐฑ์— ์˜์กดํ•˜๋Š” ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฐ ์ด๊ฑธ ์ข…์ข… ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ผ๊ณ  ๋ถ€๋ฅด์ฃ . ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜๋‹ˆ๊นŒ์š”!

๋‹คํ–‰ํžˆ๋„ ์šฐ๋ฆฌ์—๊ฒ ์ด์ œ promise๋ผ๋Š” ๋„์šฐ๋ฏธ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค! promise๊ฐ€ ๋ญ”์ง€ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ณด๋„๋ก ํ•˜์ฃ ! ๐Ÿ˜ƒ


Promise ๋ฌธ๋ฒ•

๋งŽ์€ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ES6์— ๋„์ž…๋œ Promise์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค:

โ€œPromise๋Š” ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ์— ๋Œ€ํ•œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฆฌํ‘œ์‹œ์ž(placeholder) ์ž…๋‹ˆ๋‹คโ€

๋„ค..์ €๋Š” ์ด ์„ค๋ช…์ด ์ „ํ˜€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ฒŒ ๋Š๊ปด์กŒ์–ด์š”. ์‚ฌ์‹ค ์ด๊ฑด Promise๋ฅผ ๋” ์ด์ƒํ•˜๊ณ , ๋ง‰์—ฐํ•˜๊ณ , ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ์„ค๋ช…์ด์˜€์ฃ . ๊ทธ๋Ÿผ Promise๊ฐ€ ์‹ค์ œ๋กœ ์•ฝ์†ํ•ด์ฃผ๋Š” ๊ฒŒ ๋ญ”์ง€ ๋ณด๋„๋ก ํ•˜์ฃ .

์šฐ๋ฆฐ ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” Promise ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Promise๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์•„์š”. ํ•œ ๋ฒˆ ํ•ด๋ณด์ฃ !

์ž ๊น๋งŒ, ๋ญ๊ฐ€ ๋ฐ˜ํ™˜๋์ฃ ?

Promise ๋Š” ์ƒํƒœ์ธ([[PromiseStatus]])์™€ ๊ฐ’์ธ ([[PromiseValue]])์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ,ย [[PromiseStatus]]ย ์ด "pending"์ด๊ณ , promise์˜ ๊ฐ’์ด undefined์ธ ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

๊ฑฑ์ •๋งˆ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์œผ๋‹ˆ๊นŒ์š”, [[PromiseStatus]]์™€ [[PromiseValue]] ์†์„ฑ์— ์ ‘๊ทผ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ์†์„ฑ์˜ ๊ฐ’๋“ค์€ promise๊ฐ€ ๋™์ž‘ํ•  ๋•Œ ์•„์ฃผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


PromiseStatus์˜ ๊ฐ’์€ 3๊ฐ€์ง€์˜ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • โœ…ย fulfilled: Promise๊ฐ€ resolved ๋๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ๋“ค์ด ์ž˜ ๋˜๊ณ  promise ๋‚ด์—์„œ ์–ด๋–ค ์—๋Ÿฌ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด์ฃ .
  • โŒย rejectedย : Promise๊ฐ€ rejected ๋œ ๊ฒ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ์ž˜๋ชป ๋์„ ๋•Œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • โณย pending: Promise๊ฐ€ ์™„๋ฃŒ๋˜์ง€๋„ ์•Š์•˜๊ณ , ์‹คํŒจํ•˜์ง€๋„ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. (์•„์ง๊นŒ์ง€๋Š”), Promise๊ฐ€ ์—ฌ์ „ํžˆ pending ์ƒํƒœ์ธ๊ฑฐ์ฃ .

์ข‹์•„์š”. ์ด ๋ชจ๋“  ๊ฒŒ ๊ดœ์ฐฎ๊ฒŒ ๋ณด์ด์ง€๋งŒ, ์–ธ์ œ promise์˜ ์ƒํƒœ๊ฐ€ "pending"์ด๊ณ  "fulfilled"๋‚˜ "rejected"๊ฐ€ ๋ ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์™œ ์ด ์ƒํƒœ๊ฐ€ ์ค‘์š”ํ•œ๊ฑธ๊นŒ์š”?

์œ„์˜ ์˜ˆ์ œ์—์„œ, ์šฐ๋ฆฐ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ธ () => {}๋ฅผ Promise ์ƒ์„ฑ์ž๋กœ ๋„˜๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ 2๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ณดํ†ต resolve๋‚˜ res๋กœ ํ•˜๋Š”๋ฐ, ์ด๋Š” Promise๊ฐ€ resolve ์ผ ๋•Œ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ณดํ†ต reject๋‚˜ rej๋กœ ํ•˜๋Š”๋ฐ Promise๊ฐ€ reject์ผ ๋•Œ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ๋ญ๊ฐ€ ์ž˜๋ชป๋๋‹ค๋Š” ๊ฑฐ์ฃ .

promises and async await 3

resolve๋‚˜ reject ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋์„ ๋•Œ ์–ด๋–ค ๋กœ๊ทธ๊ฐ€ ๋‚จ๊ฒจ์ง€๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ฃ ! ์˜ˆ์ œ์—์„ , resolve๋ฅผ res๋กœ, reject๋ฅผ rej๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋๋‚ด์ฃผ๋„ค์š”! ๋“œ๋””์–ด "pending" ์ƒํƒœ์™€ undefined ๊ฐ’์„ ๋‚ ๋ ค๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค! ๋งŒ์•ฝ resolve ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋˜๋ฉด Promise์˜ ์ƒํƒœ๋Š” "fulfilled"๊ฐ€ ๋˜๊ณ , rejected ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋˜๋ฉด "rejected"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Promise์˜ ๊ฐ’์€ [[PromiseValue]]๊ณ  ์ด๋Š”, resolved๋‚˜ rejected๋ผ๋Š” ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž์˜ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค์€, Jake Archibald๊ฐ€ ์ด ๊ธฐ์‚ฌ๋ฅผ ๊ต์ •ํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ, ๊ทธ๋Š” ์‹ค์ œ๋กœ ํฌ๋กฌ์—์„œ ์ง€๊ธˆ โ€œfulfilledโ€ ๋Œ€์‹  โ€œresolvedโ€ ์ƒํƒœ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Œ์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. Mathias Bynens ๋•๋ถ„์— ์นด๋‚˜๋ฆฌ ๋ฒ„์ „์—์„œ ์ˆ˜์ •์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

๐Ÿ”— Jake Archibaldโ€™s tweet: Chrome and Safari call this a โ€œresolvedโ€ promise, which is true, but kinda misleadingโ€ฆ


์ข‹์•„์š”, ์ด์ œ ๋ง‰์—ฐํ•œ Promise ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์•ผํ•  ์ง€ ์กฐ๊ธˆ ๋” ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ด๊ฒŒ ์–ด๋””์— ์“ฐ์ผ๊ฐ€์š”?

์†Œ๊ฐœ ๋ถ€๋ถ„์—์„œ ๋ณด์—ฌ๋“œ๋ ธ๋˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด, ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›๊ณ , ์••์ถ•ํ•ด์„œ, ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ณ  ์ €์žฅํ–ˆ์—ˆ์ฃ ! ๊ฒฐ๊ตญ ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ์œผ๋กœ ๋‚œ์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„, Promise๊ฐ€ ์ด ๋ถ€๋ถ„์„ ๋„์™€์ฃผ์ฃ ! ๋จผ์ €, ์ „์ฒด ์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ๊ฐ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜์„ Promise๋กœ์š”.

์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ๋กœ๋“œ ๋˜์—ˆ๋‹ค๋ฉด, Promise๋Š” ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ resolve ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜๋Š” ์ค‘์— ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด, promise๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•˜๋Š” reject ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ์‹œ๋‹ค.

promises and async await 5

ํ„ฐ๋ฏธ๋„์—์„œ ์‹ค์ œ๋กœ ์ด๊ฒŒ ๋™์ž‘ํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด๋„๋ก ํ•˜์ฃ !

๋ฉ‹์ง‘๋‹ˆ๋‹ค! Promise๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„ค์š”.

๊ทธ๋Ÿฐ๋ฐ..์ด์ œ ๋ญ์ฃ ? ์šฐ๋ฆฐ Promise ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๋ณผ ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ทธ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋งŒ ๋ด์•ผํ•˜์ฃ . ๊ทธ๋ž˜์„œ Promise์˜ ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Promise์—๋Š” 3๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • .then(): Promise์˜ ์™„๋ฃŒ ๋’ค์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • .catch(): Promise์˜ ์‹คํŒจ ๋’ค์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • .finally(): Promise๊ฐ€ ์™„๋ฃŒ๊ฐ€ ๋˜๊ฑฐ๋‚˜ ์‹คํŒจ๊ฐ€ ๋˜๋”๋ผ๋„ ํ•ญ์ƒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

promises and async await 7

.then ๋ฉ”์†Œ๋“œ๋Š” resolve ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

.catch ๋ฉ”์†Œ๋“œ๋Š” rejected ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, Promise์˜ ์ „์ฒด ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ Promise๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์— ๊ด€๋ จ๋œ ๊ฐ’๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ฃ .


์ฐธ๊ณ ๋กœ, Promise๊ฐ€ ํ•ญ์ƒ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋Š”, Promise์˜ ์™„๋ฃŒ๋‚˜ ์‹คํŒจ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์œผ๋กœ Promise.resolve๋‚˜ Promise.reject๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

promises and async await 10

๋‹ค์Œ ์˜ˆ์ œ๋“ค์—์„œ ์ด๋Ÿฐ ๋ฌธ๋ฒ•์„ ์ข…์ข… ๋ณด์‹œ๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค ๐Ÿ˜„


getImage ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋Š”๋ฐ์š”. ๋‹คํ–‰ํžˆ๋„ .then ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ๐Ÿฅณ

.then์˜ ๊ฒฐ๊ณผ ์ž์ฒด ๋˜ํ•œ Promise์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ .then์„ ์ฒด์ด๋‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด์ฃ : ์ด์ „ then ์ฝœ๋ฐฑ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์˜ ์ธ์ž๋กœ์จ ๋‹ค์Œ .then ์ฝœ๋ฐฑ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค!

promises and async await 11

getImage ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ then ์ฝœ๋ฐฑ์„ ์ฒด์ด๋‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝœ๋ฐฑ ์ค‘์ฒฉ ๋Œ€์‹  ๊น”๋”ํ•œ then ์ฒด์ด๋‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

promises and async await 12

์™„๋ฒฝํ•˜๋„ค์š”! ์ด ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์ฝœ๋ฐฑ ์ค‘์ฒฉ๋ณด๋‹ค ํ›จ์”ฌ ๋‚˜์•„ ๋ณด์ž…๋‹ˆ๋‹ค.


Microtask์™€ (Macro)task

์ด์ œ Promise๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ์ข€ ๋” ์ž˜ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  Promise์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ถ”์ถœ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์— ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์ถ”๊ฐ€ํ•ด์„œ ์‹คํ–‰ ํ•ด๋ณด์ฃ :

์ž ๊น ์ด๊ฒŒ ๋ญ์ฃ ?! ๐Ÿคฏ

๋จผ์ €, Start!๊ฐ€ ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์ง‘๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์ฃ . ์šฐ๋ฆฐ console.log('Start!')๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์— ์žˆ๋Š” ๊ฑธ ๋ดค์œผ๋‹ˆ๊นŒ์š”! ๊ทธ๋Ÿฐ๋ฐ, ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์ง€๋Š” ๋‘ ๋ฒˆ์งธ ๊ฐ’์ด End!์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑด Promise์˜ ์™„๋ฃŒ ๊ฐ’์ด ์•„๋‹ˆ์ฃ ! End!๊ฐ€ ๋‚จ๊ณ ๋‚˜์„œ์•ผ Promise์˜ ๊ฐ’์ด ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚œ๊ฑธ๊นŒ์š”?

์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ Promise์˜ ์ง„๋ฉด๋ชฉ์„ ๋ณธ ๊ฒ๋‹ˆ๋‹ค! ๐Ÿš€๋น„๋ก JavaScript๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๊ธด ํ•˜์ง€๋งŒ, ์šฐ๋ฆฐ Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์ธ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


๊ทธ๋Ÿฐ๋ฐ ์ž ์‹œ, ์ด์ „์— ์ด๋Ÿฐ ๊ฑธ ๋ณธ ์  ์žˆ๋‚˜์š”? ๐Ÿค” JavaScript Event Loop์—์„œ, ์ผ์ข…์˜ ๋น„๋™๊ธฐ์ ์ธ ๋™์ž‘์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•˜์—ฌ setTimeout๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ฃ ?

๋งž์•„์š”! ํ•˜์ง€๋งŒ, event loop ๋‚ด์—๋Š”, ์‹ค์ œ๋กœ 2๊ฐœ ์œ ํ˜•์˜ queue๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: (macro)task queue์™€ (๋˜๋Š” ๊ทธ๋ƒฅ task queue๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค) microtask queue์ž…๋‹ˆ๋‹ค. (macro)task queue๋Š” (macro)task๋“ค์„ ์œ„ํ•œ ๊ฒƒ์ด๊ณ , microtask queue๋Š” microtask๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ (macro)task์™€ microtask๋Š” ๋ญ˜๊นŒ์š”? ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช‡ ๊ฐ€์ง€๊ฐ€ ๋” ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ๋“ค์€ ์•„๋ž˜ ํ‘œ์— ์žˆ์Šต๋‹ˆ๋‹ค!

Tasks Type Cases
(Macro)task setTimeout|setInterval|setImmediate
Microtask process.nextTick|Promise callback|queueMicrotask

์•„, Promise๋Š” microtask ๋ชฉ๋ก์— ์žˆ์ฃ ! ๐Ÿ˜ƒ Promise๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๊ทธ๊ฒƒ์˜ then(), catch()๋‚˜ finally()๋‚˜, ๋ฉ”์†Œ๋“œ ๋˜๋Š” ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ์ฝœ๋ฐฑ์€ microtask queue์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค! ์ด ๋ง์€ then(), catch()๋‚˜ finally() ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ์ฝœ๋ฐฑ์ด ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๋ณธ์งˆ์ ์œผ๋กœ JavaScript ์ฝ”๋“œ์— ๋น„๋™๊ธฐ์ ์ธ ๋™์ž‘์„ ๋”ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ !

๊ทธ๋Ÿผ then(), catch()๋‚˜ finally()์˜ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ์–ธ์ œ์ผ๊นŒ์š”? event loop๋Š” task์— ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค:

  1. ํ˜„์žฌ ์ฝœ ์Šคํƒ์— ์žˆ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.
  2. ์ฝœ ์Šคํƒ์ด ๋น„๋ฉด, ํ์— ์Œ“์—ฌ์žˆ๋Š” ๋ชจ๋“  microtask๊ฐ€ ํ•˜๋‚˜์”ฉ ๋น ์ ธ๋‚˜์˜ค๊ณ  ์ฝœ ์Šคํƒ์œผ๋กœ ๊ฐ€์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (microtask ๊ทธ ์ž์ฒด๋“ค ๋˜ํ•œ ์ƒˆ๋กœ์šด microtask๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ํšจ๊ณผ์ ์œผ๋กœ ๋ฌดํ•œ์˜ microtask ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ฌ)
  3. ๋งŒ์•ฝ ์ฝœ ์Šคํƒ๊ณผ microtask queue๊ฐ€ ๋ชจ๋‘ ๋น„๋ฉด, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” (macro)task queue์— ๋‚จ์€ task๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ task๋“ค์ด ๋‚˜์™€์„œ ์ฝœ ์Šคํƒ์— ์Œ“์ด๊ณ  ์‹คํ–‰๋˜๊ณ  ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค!

๋น ๋ฅด๊ฒŒ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ฃ :

  • Task1: ํ•จ์ˆ˜๋Š” ์ฝœ ์Šคํƒ์— ์ฆ‰์‹œ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ์ฆ‰์‹œ์š”.
  • Task2, Task3, Task4: mircotask๋“ค์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด promise์˜ then ์ฝœ๋ฐฑ์ด๋‚˜ queueMicrotask์— ์ถ”๊ฐ€๋œ task์ž…๋‹ˆ๋‹ค.
  • Task5, Task6: (macro)task์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด setTimeout์ด๋‚˜ setImmediate์˜ ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค.

๋จผ์ €, Task1์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, ์—”์ง„์€ microtask queue์— ์Œ“์—ฌ์žˆ๋Š” task๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น task๋“ค์ด ์ „๋ถ€ ์ฝœ ์Šคํƒ์— ์˜ค๋ฅด๊ณ  ๋น ์ ธ๋‚˜๊ฐ€๋ฉด, ์—”์ง„์€ (macro)task queue์— task๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น queue์—์„œ ๋นผ์˜จ ๋‹ค์Œ ์ฝœ ์Šคํƒ์— ์˜ฌ๋ฆฌ๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

์ข‹์•„์š”. ๋ถ„ํ™์ƒ‰ ๋ฐ•์Šค๊ฐ€ ์•„์ฃผ ๋งŽ๋„ค์š”. ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ฃ !

promises and async await 15

์œ„ ์ฝ”๋“œ์—์„œ, macro task๋กœ setTimeout์„ ์‚ฌ์šฉํ•˜๊ณ , microtask๋Š” promise์˜ then() ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์—”์ง„์ด setTimeout ํ•จ์ˆ˜ ๋ผ์ธ์— ๋„๋‹ฌํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚จ๋Š”์ง€ ๋ณด๋„๋ก ํ•˜์ฃ !


์ฐธ๊ณ  - ์˜ˆ์ œ์—์„œ๋Š” console.log, setTimeout์ด๋‚˜ Promise.resolve๋ฅผ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€๋œ๋‹ค๊ณ  ๋ณด์—ฌ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋“ค์ด๊ณ  ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์—์„  ์‹ค์ œ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ๊ทธ๋Ÿฌ๋‹ˆ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋„ ์ด๊ฒƒ๋“ค์ด ๋ณด์ด์ง€ ์•Š๋”๋ผ๋„ ๊ฑฑ์ •๋งˆ์„ธ์š”! ์—ฌ๋Ÿฌ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ ๊ฐœ๋…์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์—์„œ ์—”์ง„์ด console.log() ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€๋˜๊ณ , ์ฝ˜์†”์— Start!๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ„ ๋’ค ์—”์ง„์€ ์ฒ˜๋ฆฌ๋ฅผ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค.

์—”์ง„์€ setTimeout ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋‚˜๊ณ , ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. setTimeout ๋ฉ”์†Œ๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค: ์ด๊ฒƒ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” (() => console.log('In timeout')) ์ธ๋ฐ ํƒ€์ด๋จธ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ Web API์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋น„๋ก ํƒ€์ด๋จธ์— 0์„ ๋„ฃ์—ˆ์ง€๋งŒ, ์ฝœ๋ฐฑ์€ Web API์— ๋จผ์ € ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋’ค (macro)task queue์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค: setTimeout์€ macro task์ž…๋‹ˆ๋‹ค!


์—”์ง„์ด Promise.resolve() ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค. Promise.resolve() ๋ฉ”์†Œ๋“œ๋Š” ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€๋˜๊ณ  ์™„๋ฃŒ๋Š” ๊ฐ’์œผ๋กœ Promise๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ then ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” microtask queue์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.


์—”์ง„์€ console.log() ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ๊ทธ ์ฆ‰์‹œ ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€ ๋˜๊ณ , ์ฝ˜์†”์— End!๋ผ๋Š” ๊ฐ’์„ ๋‚จ๊ธด ๋’ค, ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ€๊ณ , ์—”์ง„์€ ๊ณ„์† ์ฒ˜๋ฆฌ๋ฅผ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค.

์—”์ง„์€ ํ˜„์žฌ ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฑธ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, microtask queue์— ์Œ“์ธ task๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ๊ฒ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์—๋Š” promise์˜ then ์ฝœ๋ฐฑ์ด ์ž์‹ ์˜ ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๊ฒŒ ๋น ์ ธ๋‚˜์™€ ์ฝœ ์Šคํƒ์— ๋“ค์–ด๊ฐ€๊ณ , promise์˜ resolve ๊ฐ’์„ ๋กœ๊ทธ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค: ์ด๋ฒˆ ์˜ˆ์ œ์—์„  ๋ฌธ์ž์—ด Promise!์ž…๋‹ˆ๋‹ค.

์—”์ง„์€ ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฑธ ์•Œ๊ณ , microtask queue์— ์Œ“์ธ task๊ฐ€ ์žˆ๋Š”์ง€ ํ•œ ๋ฒˆ ๋” ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ์—†์ฃ . microtask queue๊ฐ€ ์™„์ „ํžˆ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ (macro)task queue๋ฅผ ๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค: setTimeout ์ฝœ๋ฐฑ์€ ์—ฌ์ „ํžˆ ๊ฑฐ๊ธฐ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค! setTimeout ์ฝœ๋ฐฑ์ด ๋น ์ ธ๋‚˜์™€ ์ฝœ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด "In timeout!"์„ ๋‚จ๊ธฐ๋Š” console.log ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋’ค ์ฝœ๋ฐฑ์€ ์ฝœ ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ชจ๋“  ๊ฒŒ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค! ๐Ÿฅณ์•ž์—์„œ ๋ดค๋˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์˜ˆ์ƒ ๋ฐ–์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋„ค์š”.


Async/Await

ES7์€ JavaScript์—์„œ ๋น„๋™๊ธฐ ๋™์ž‘์„ ๋‹ค๋ฃจ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ–ˆ๊ณ , ๊ทธ๊ฒƒ์€ promise๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค! async์™€ await ํ‚ค์›Œ๋“œ์˜ ๋„์ž…์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋ฌต์‹œ์ ์œผ๋กœ promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” async ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ.. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•˜์ฃ ? ๐Ÿ˜ฎ

์ „์—, ์šฐ๋ฆฌ๋Š” new Promise(() => {})๋‚˜ Promise.resolve๋‚˜ Promise.reject๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ promise๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฌต์‹œ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ด ๋ง์€ ์šฐ๋ฆฌ๊ฐ€ ๋”์ด์ƒ Promise ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

promises and async await 22

๋น„๋ก async ํ•จ์ˆ˜๊ฐ€ ๋ฌต์‹œ์ ์œผ๋กœ promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์•„์ฃผ ๋Œ€๋‹จํ•œ ์ผ์ด์ง€๋งŒ, async ํ•จ์ˆ˜์˜ ์ง„๋ฉด๋ชฉ์€ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! await ํ‚ค์›Œ๋“œ๋กœ await ํ•œ(๊ธฐ๋‹ค๋ฆฐ) ๊ฐ’์ด promise ์™„๋ฃŒ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— then() ์ฝœ๋ฐฑ๊ณผ ๊ฐ™์ด ๋งŒ์•ฝ ์ด๋Ÿฐ promise์˜ ์™„๋ฃŒ ๊ฐ’์„ ์›ํ•œ๋‹ค๋ฉด, await ๋œ promise์˜ ๊ฐ’์— ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์šฐ๋ฆฐ async ํ•จ์ˆ˜๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ฃ ? ์ข‹์•„์š”. ๊ทธ๋Ÿฐ๋ฐ..์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ์ฃ ?

์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ์‹คํ–‰ํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด์‹œ์ฃ :

ํ .. ์ง€๊ธˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”๊ฑฐ์ฃ ?


๋จผ์ €, ์—”์ง„์ด console.log๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค. ์ฝœ ์Šคํƒ์—์„œ Before function!์„ ๋‚จ๊ธฐ๊ณ  ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ, async ํ•จ์ˆ˜์ธ myFunc()๋ฅผ ํ˜ธ์ถœํ•œ ํ›„, myFunc์˜ ํ•จ์ˆ˜ ๋ฐ”๋”” ์˜์—ญ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•จ๋ถ€ ๋ฐ”๋”” ์˜์—ญ ๋‚ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์—์„œ, ์ด๋ฒˆ์—๋Š” ๋ฌธ์ž์—ด์ด In function!์ธ ๋˜ ๋‹ค๋ฅธ console.log๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. console.log๋Š” ์ฝœ ์Šคํƒ์— ์ถ”๊ฐ€๋˜๊ณ , ๊ฐ’์„ ๋‚จ๊ธฐ๊ณ , ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.


ํ•จ์ˆ˜์˜ ๋ฐ”๋”” ์˜์—ญ์ด ๊ณ„์† ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ๋กœ ๋‘ ๋ฒˆ์งธ ๋ผ์ธ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. ๋“œ๋””์–ด, await ํ‚ค์›Œ๋“œ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰

์ฒซ ๋ฒˆ์งธ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ผ์€ ๋Œ€๊ธฐํ•˜๋Š” ๊ฐ’์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์ด๋ฒˆ ์˜ˆ์‹œ์—์„  ํ•จ์ˆ˜ one์ž…๋‹ˆ๋‹ค. ์ฝœ ์Šคํƒ์— ๊ฐ”๋‹ค๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ€๊ณ , ๋งˆ์ง€๋ง‰์— promise์˜ ์™„๋ฃŒ๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ promise๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  one์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—”์ง„์€ await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด, async ํ•จ์ˆ˜๋Š” ์ž ์‹œ ์ •์ง€ํ•ฉ๋‹ˆ๋‹ค. โœ‹๐Ÿผ ํ•จ์ˆ˜ ๋ฐ”๋”” ์˜์—ญ์˜ ์‹คํ–‰์ด ์ค‘๋‹จ๋˜๊ณ , async ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ผ๋ฐ˜์ ์ธ task๊ฐ€ ์•„๋‹Œ microtask๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค!


์ด์ œ await ํ‚ค์›Œ๋“œ๋ฅผ ๋งˆ์ฃผํ•˜์—ฌ async ํ•จ์ˆ˜์ธ myFunc๋Š” ์ผ์‹œ ์ค‘๋‹จ๋˜์—ˆ๊ณ , ์—”์ง„์€ async ํ•จ์ˆ˜์—์„œ ๋น ์ ธ ๋‚˜์™€ async ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค: ์ด ์˜ˆ์ œ์—์„  ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค! ๐Ÿƒ๐Ÿฝโ€โ™€๏ธ


๋งˆ์ง€๋ง‰์œผ๋กœ, ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ๋” ์ด์ƒ ์‹คํ–‰ํ•  task๊ฐ€ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋Œ€๊ธฐ ์ค‘์ธ microtask๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค: ๋Œ€๊ธฐ ์ค‘์ธ microtask๊ฐ€ ์žˆ์ฃ ! async์ธ myFunc ํ•จ์ˆ˜๋Š” one์˜ ์™„๋ฃŒ ๊ฐ’ ์ดํ›„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์ฃ . myFunc๊ฐ€ ์ฝœ ์Šคํƒ์œผ๋กœ ๋“ค์–ด์™€ ๋‚จ์€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ res๋Š” ๋“œ์ด์–ด ์ž์‹ ์˜ ๊ฐ’์„ ์–ป๋Š”๋ฐ, one์—์„œ ๋ฐ˜ํ™˜๋œ promise์˜ ์™„๋ฃŒ ๊ฐ’์ด ๋˜๊ฒ ์ฃ ! ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ res์˜ ๊ฐ’์œผ๋กœ console.log๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. One!์ด ์ฝ˜์†”์— ๊ธฐ๋ก๋˜๊ณ  ์ฝœ ์Šคํƒ์„ ๋น ์ ธ๋‚˜๊ฐ‘๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋“œ๋””์–ด, ๋‹ค ๋๋‚ฌ์Šต๋‹ˆ๋‹ค! async ํ•จ์ˆ˜๊ฐ€ promise์˜ then๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ๊ฒŒ ๋˜์…จ๋‚˜์š”? await ํ‚ค์›Œ๋“œ๋Š” async ํ•จ์ˆ˜๋ฅผ ์ผ์‹œ ์ค‘๋‹จํ•˜๋Š” ๋ฐ˜๋ฉด, Promise์˜ ๋ฐ”๋””๋Š” then์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค!


ํ  ์ƒ๋‹นํžˆ ๋งŽ์€ ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค! ๐ŸคฏPromise๋กœ ์ž‘์—…์„ ํ•˜์‹ค ๋•Œ ์•ฝ๊ฐ„ ์••๋„๋˜๋Š” ๋Š๋‚Œ์ด ๋“ค๋”๋ผ๋„ ๊ฑฑ์ •๋งˆ์„ธ์š”. ๊ฐœ์ธ์ ์œผ๋กœ ๋น„๋™๊ธฐ JavaScript ๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋•Œ ํŒจํ„ด์„ ์ตํžˆ๊ณ  ์ž์‹ ๊ฐ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋น„๋™๊ธฐ JavaScript๋กœ ์ž‘์—…์„ ํ•˜์‹ค ๋•Œ โ€œ์˜ˆ๊ธฐ์น˜์•Š์€โ€ ๋„๋Š” โ€œ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š”โ€ ๋™์ž‘๋“ค์ด ์กฐ๊ธˆ ๋” ์ดํ•ด๋˜์…จ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ๋Š˜ ๊ทธ๋ ‡๋“ฏ, ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด์ฃผ์„ธ์š”! ๐Ÿ˜Š