๐Ÿ‘จ๐Ÿปโ€๐Ÿš’Asynchronous JavaScript(4) - Sprint Part 1

โฐSprint Part 1 - ํƒ€์ด๋จธ API

๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ๋Œ€ํ‘œ ๋น„๋™๊ธฐ API - setTimeout, setInterval

Mission 1. part-1/index.html ์„ ์—ด์–ด๋ณด๊ธฐ

part-1/index.html ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์–ด๋ณด๊ณ , callback, promise, async & await ๋ฒ„ํŠผ์„ ๊ฐ๊ฐ ํด๋ฆญํ•ด๋ณด์„ธ์š”.

์ด ๋ฒ„ํŠผ๋“ค์€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์•ก์…˜์„ ํ•˜์ง€๋งŒ, ๊ทธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Mission 1. ๊ฒฐ๋ก 

์ž‘๋™์€ ๋™์ผํ•˜๊ฒŒ ๋˜์ง€๋งŒ ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋กœ ์ดํ•ด.

Mission 2. part-1/script.js ํŒŒ์ผ์„ ์—ด์–ด ํ™•์ธํ•˜๊ธฐ

Mission 2-1. callback

โบcallback ๋ฒ„ํŠผ์€ runCallback ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

delay ๋ผ๋Š” ํ•จ์ˆ˜๋Š” 01_callback.js ์— ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.

์˜ค~ delay ํ•จ์ˆ˜๋Š” wait ๊ณผ callback ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์€ ๋‹ค์Œ setTimeout ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๊ตฌ๋‚˜!

1์ดˆ ๋’ค์— pauseVideo(), displayTitle() ์„ ์‹คํ–‰ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ delay ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ, 0.5์ดˆ ๋’ค์— highlightTitle() ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๊ณ ,

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ delay ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ, 2์ดˆ ๋’ค resetTitle() ์ด ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ์˜ ํ•จ์ˆ˜์ด๋‹ค.

โฉcallback ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๊ฐ€ curly bracket ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด๋ผ๋Š” ์ ์„ ์œ ์‹ฌํžˆ ๋ด์•ผ ํ•œ๋‹ค.

Mission 2-2. promise

โบpromise ๋ฒ„ํŠผ์€ runPromise ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ •์˜๋œ runPromise() ํ•จ์ˆ˜ ๋‚ด์—๋Š” sleep ์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

sleep ํ•จ์ˆ˜๋Š” 02_promiseConstructor.js ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

์˜ค~ sleep ์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” wait ์ด๋ผ๋Š” ์ธ์ž๋งŒ ๋ฐ›๋„ค? ์–ด? ์•„๊นŒ ์œ„์— delay ํ•จ์ˆ˜๋Š” wait ์ธ์ž ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ callback ํ•จ์ˆ˜๋„ ์ธ์ž๋กœ ๋ฐ›์•˜๋Š”๋ฐ ๋ง์ด๋‹ค?!

์—ฌํŠผ sleep ํ•จ์ˆ˜๋Š” wait ์ธ์ž ๋งŒ์„ ๋ฐ›๊ณ  promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

promise ๊ฐ์ฒด๋Š” ์ธ์ž๋กœ executor ๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ,

์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—๋Š” ๋˜ ๋‹ค๋ฅธ 2๊ฐ€์ง€์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ย resolve ์™€ reject ํ‚ค์›Œ๋“œ ์ด๋‹ค.

โ€ข resolve : ๊ธฐ๋Šฅ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์„œ ๋งˆ์ง€๋ง‰์— ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜

โ€ข reject : ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ์ฝœ๋ฐฑํ•จ์ˆ˜

โฉ์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ ๋  ๋•Œ setTimeout api ๋ฅผ ๋ฆฌํ„ด(์‹คํ–‰) ํ•˜๊ฒŒ ํ•œ๋‹ค.์–ด๋–ป๊ฒŒ?

setTimeout ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— resolve ํ•จ์ˆ˜๋ฅผ ํƒœ์›Œ์„œ!

Mission 2-3. async & await

โบasync & await ๋ฒ„ํŠผ์€ runAsync ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ์ ์ธ ์•„์ด๋“ค์„ ๋งˆ์น˜ ๋™๊ธฐ์ ์œผ๋กœ(?) ์‹คํ–‰ ๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ด ์ฃผ๋Š” โ€˜syntactic sugarโ€™

๋งˆ์น˜ ๋ชจ๋“  ๋กœ์ผ“๋“ค์ด ๋ฐœ์‚ฌ ์ค€๋น„๋ฅผ ๋‹ค ๋งˆ์นœ ์ƒํƒœ ์—์„œ (๋ฒ„ํŠผํ•˜๋‚˜๋ˆ„๋ฅด๋ฉด์ง€๊ตฌ๊ฐ€๋ฉธ๋ง) await ์ด๋ผ๋Š” ์ž ๊ธˆ?์žฅ์น˜๋ฅผ ๊ฑธ์–ด ๋†จ๋‹ค๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋กœ์ผ“ ๋ถ€ํ„ฐ ๋ฐœ์‚ฌ์‹œ์ผœ ๋‚˜๊ฐ€๋Š” ๋Š๋‚Œ์ด๋ž„๊นŒ?

Mission 3. delay ํ•จ์ˆ˜์™€ sleep ํ•จ์ˆ˜์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.

delay ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ wait ๊ณผ callback ํ•จ์ˆ˜๋ฅผ ๋ฐ›์ง€๋งŒ,

sleep ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ wait ๋งŒ์„ ๋ฐ›๊ณ  new Promise ๋กœ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” executor ๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , ์ด ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ธ์ž๋กœ๋Š” resolve, reject ๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Mission 4. runAsync ํ•จ์ˆ˜

runAsync ํ•จ์ˆ˜๋Š” async ๋ฐ await ํ‚ค์›Œ๋“œ์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ํ๋ฆ„์ด ๋งˆ์น˜ ๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” Promise๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ฝ”๋“œ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ, ์‹œ๊ฐ„์˜ ํ๋ฆ„๋Œ€๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

Bare Minimum Requirements

โบPromise ์‹คํ–‰ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ, resolve, reject๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋‚˜์š”?

promise ๊ฐ์ฒด๋Š” ์ธ์ž๋กœ executor ๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—๋Š” ๋˜ ๋‹ค๋ฅธ 2๊ฐ€์ง€์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

๊ทธ๊ฒŒ ๋ฐ”๋กœ ย resolve ์™€ reject ํ‚ค์›Œ๋“œ ์ด๋‹ค.

โ€ข resolve : ๊ธฐ๋Šฅ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์„œ ๋งˆ์ง€๋ง‰์— ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜

โ€ข reject : ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ์ฝœ๋ฐฑํ•จ์ˆ˜

โบresolve, reject ํ•จ์ˆ˜์—๋Š” ์ธ์ž๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋„˜๊ธฐ๋Š” ์ธ์ž๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

resolve ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด ๋‚˜์˜จ ์ตœ์ข… ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ์ž๋กœ ๋‹ด๊ธด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” โ€˜helloโ€™ ๋ผ๋Š” ๋ฌธ์ž์—ด ์ด์˜€๋‹ค.

์ด์ œ promise ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์จ๋จน๋Š” consumer ํ•จ์ˆ˜์—์„œ .then ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์–ด ๋ฐ›์•„ (๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ด ๋ฐ›์•„์„œ) ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ ๋ฐ ๊ฐ€๊ณต์„ ํ•œ๋‹ค.

reject ํ•จ์ˆ˜๋Š” .catch ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค.

callback ์„ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ๋Š” ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ๋œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, Promise ๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ๋Š” consumer ํ•จ์ˆ˜์—์„œ ์ œ์ผ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ .catch ๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

.then, .catch ์™ธ์—๋„ .finally ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋„ ์žˆ๋‹ค.

์–˜๋„ consumer ํ•จ์ˆ˜ ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑํ•ด ์ฃผ๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฑด ์–ด์ฉŒ๊ฑด ๋ฌด์กฐ๊ฑด ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋˜์–ด ์ง„๋‹ค. ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๋งˆ์ง€๋ง‰์— ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

โบPromise์˜ ์„ธ๊ฐ€์ง€ ์ƒํƒœ๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋‚˜์š”?

โ€ข ๋Œ€๊ธฐ(pending): ์ดํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ.

โ€ข ์ดํ–‰(fulfilled): ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ.

โ€ข ๊ฑฐ๋ถ€(rejected): ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ.

โบawait ํ‚ค์›Œ๋“œ ๋‹ค์Œ์— ๋“ฑ์žฅํ•˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰์€, ์–ด๋–ค ํƒ€์ž…์„ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‚˜์š”?

ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ Promise ํƒ€์ž…์„ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌดํ„ฑ๋Œ€๊ณ  ์•„๋ž˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ,

async setTimeout(() => {
    console.log('๋‚˜๋Š” ๋น„๋™๊ธฐ');
} ,1000)

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ๊ณ  setTimeout ์•ž์— async ๋ฅผ ๋ถ™์ธ๋‹ค ํ•ด์„œ ๋™๊ธฐ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ ์ด๋‹ค.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook