Skip to content

Latest commit

ย 

History

History
631 lines (449 loc) ยท 24.2 KB

step7.md

File metadata and controls

631 lines (449 loc) ยท 24.2 KB

๋ฌธ์„œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

STEP 7

๐Ÿ’ก์งˆ์˜์‘๋‹ต์€ https://github.com/pul8219/TIL Issues ํƒญ์˜ ์•Œ๋งž์€ step ์ด์Šˆ์•ˆ์— ๋‚จ๊ฒจ์ฃผ์„ธ์š”. โžก๏ธ Issueํƒญ์œผ๋กœ ์ด๋™

  • ์ž‘์„ฑ์ž: Wol-dan (@pul8219)
  • ์Šคํ„ฐ๋”” ์ฃผ์ œ: FrontEnd ๋ฉด์ ‘ ์Šคํ„ฐ๋”” https://gitlab.com/siots-study/topics/-/wikis/home
  • ๊ณต๋ถ€ ๋ฒ”์œ„: Asyncronous โžก๏ธ Motivation - ํƒ€์ด๋จธ API, ๋ธŒ๋ผ์šฐ์ €์˜ Javascript ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •, ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ
  • ๊ธฐํ•œ: 8/29(ํ† ) ~ 9/1(ํ™”)

๋ณด์ถฉ ํ•„์š”

  • async / await
  • Javascript ๋Ÿฐํƒ€์ž„์— ์ด๋ฃจ์–ด์ง€๋Š” ์ผ๋“ค
  • Promise ๊ด€๋ จ ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ
  • map ๋ฉ”์†Œ๋“œ
  • promise ์˜ˆ์ œ์—์„œ ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๊ฑฐ๋‚˜ () => ๊ฐ™์ด ๋“ค์–ด๊ฐ€์žˆ์„ ๋•Œ ๋ช…ํ™•ํ•œ? ์˜๋ฏธ๋ฅผ ๋” ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
  • setTimeout() ๋“ฑ์˜ ํƒ€์ด๋จธ๋‚˜ ์ฝœ๋ฐฑ์˜ ๋น„๋™๊ธฐ์  ์ง„ํ–‰ ์ž์„ธํžˆ
  • ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋˜ ์‚ฌ์šฉ๋ฒ• ๊ณ ์น˜๊ณ  ์ œ๋Œ€๋กœ ์•Œ๊ธฐ https://flik.tistory.com/53

Javascript

๋ชฉ์ฐจ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Motivation - ํƒ€์ด๋จธ API

  1. setTimeout(), clearTimeout()
  2. setInterval(), clearInterval()
  • ms(๋ฐ€๋ฆฌ ์ดˆ) ๋‹จ์œ„์ด๋‹ค.(1000ms = 1s)
  • setTimeout()๊ณผ, setInterval()์€ ๊ฐ๊ฐ ํƒ€์ด๋จธ ์‹๋ณ„์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ์ค‘์ธ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •ํ™•ํ•œ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.
// ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ• ์ด์šฉ
const timeoutId = setTimeout(() => {
  console.log('setTimeout์ด ์‹คํ–‰๋œ์ง€ 3์ดˆ๊ฐ€ ์ง€๋‚จ');
}, 3000);

clearTimeout(timeoutId); // clearTimeout์œผ๋กœ setTimeout()์˜ ๋ฐ˜ํ™˜๊ฐ’์ธ ์‹๋ณ„์ž๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํƒ€์ด๋จธ๊ฐ€ ์ทจ์†Œ๋œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ Javascript ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •

ํ˜ธ์ถœ ์Šคํƒ(Call Stack)

  • Javascript ์—”์ง„์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์ด๋ผ๋Š” ์Šคํƒ ํ˜•ํƒœ์˜ ์ €์žฅ์†Œ์— ๊ด€๋ฆฌํ•œ๋‹ค.

  • ํ˜ธ์ถœ ์Šคํƒ์— ์ €์žฅ๋˜๋Š” ๊ฐ ํ•ญ๋ชฉ์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ฐธ๊ณ 

  • ํ˜ธ์ถœ ์Šคํƒ์— ์ž‘์—…์ด ์กด์žฌํ•˜๋Š” ๋™์•ˆ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋จนํ†ต์ด ๋œ๋‹ค.

  • ํ˜ธ์ถœ ์Šคํƒ์˜ ์ž‘์—…์ด ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋Š๊ธฐ๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ž‘์—… ํ(Task Queue)

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ž‘์—…์„ ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ผ์„ Javscript ์—”์ง„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ API๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์— ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ๋•Œ ์ผ์ด ๋๋‚˜๋ฉด ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ์„ ๊ฐ™์ด ๋“ฑ๋กํ•œ๋‹ค.

TODO ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” API์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

  • ์œ„์ž„๋œ ์ผ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ์™€ ์ฝœ๋ฐฑ์„ ์ž‘์—… ํ(Task Queue)์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์›Œ์งˆ ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ž‘์—…์„ ๊บผ๋‚ด์™€์„œ ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ž‘์—… ํ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‚ฌ์ด์‚ฌ์ด์— ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์„ ์ƒˆ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์›Œ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์„ ์ƒˆ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ JavaScript ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ • ์ฐธ๊ณ 

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋งŒ์•ฝ ํ•ด์•ผํ•  ์ผ์ด ๋ฉ”์ดํ”Œ ์‹œ๋Ÿฝ ๊ตฌ๋งค, ๋ฐ˜์ฃฝ, ์ƒํฌ๋ฆผ ํœ˜ํ•‘ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ๋ผ๋ฉด,

  • ๋™๊ธฐ(Synchrosnous=Sync) ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ํ•ด์•ผํ•  ์ผ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋๋‚ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•œ๊ฐ€์ง€ ํ–‰๋™์ด ์™„๋ฃŒ๋์„ ๋•Œ ๋‹ค์Œ ํ–‰๋™์„ ์ง„ํ–‰ํ•œ๋‹ค.

    = ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค

    = ์–ด๋–ค ์ผ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

    ex) ๋ฉ”์ดํ”Œ ์‹œ๋Ÿผ ๊ตฌ๋งค -> ๋ฐ˜์ฃฝ -> ์ƒํฌ๋ฆผ ํœ˜ํ•‘

  • ๋น„๋™๊ธฐ(Asynchronous=Async) ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๊ฐ๊ฐ์˜ ํ–‰๋™(ํ˜น์€ ์š”์ฒญ)์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ผ์„ ์ง„ํ–‰ํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

    = ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

    = ์–ด๋–ค ์ผ์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋‚˜๊ฐ€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹

    ex)

    A์—๊ฒŒ ๋ฉ”์ดํ”Œ ์‹œ๋Ÿฝ ๊ตฌ๋งค ๋ช…๋ น

    B์—๊ฒŒ ๋ฐ˜์ฃฝ ๋ช…๋ น

    C์—๊ฒŒ ์ƒํฌ๋ฆผ ํœ˜ํ•‘ ๋ช…๋ น

    10๋ถ„ ๋’ค ๋ฉ”์ดํ”Œ ์‹œ๋Ÿฝ ๊ตฌ๋งค์™€ ์ƒํฌ๋ฆผ ํœ˜ํ•‘์ด ์™„๋ฃŒ๋œ๋‹ค.

    15๋ถ„ ๋’ค ๋ฐ˜์ฃฝ์ด ์™„๋ฃŒ๋œ๋‹ค.

    3๊ฐ€์ง€ ์ž‘์—…์„ ํ•˜๋Š”๋ฐ ์ด 15๋ถ„์ด ์†Œ์š”๋๋‹ค.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ๊ณผ ์‘๋‹ต์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋’ค์ฃฝ๋ฐ•์ฃฝ์ด ๋˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค๋Š” ๋น„ํŒ์„ ๋ฐ›์•„์™”๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Javascript์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ์˜ ์˜ˆ

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•ด ํŠน์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผ๋˜๊ธฐ ์ „๊นŒ์ง€ ์–ด๋–ค ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๋ณด๋ฅ˜ํ•˜๋Š” ๊ฒฝ์šฐ(setTimeout)

  • ์‚ฌ์šฉ์ž์˜ ์ง์ ‘ ๊ฐœ์ž…์ด ์žˆ์„ ๋•Œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋Œ€๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ(addEventListner)

  • ์›น๋ธŒ๋ผ์šฐ์ € ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋Œ€์ƒ์— ์–ด๋–ค ์ผ์„ ์š”์ฒญํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์™”์„ ๋•Œ ๋น„๋กœ์†Œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋Œ€๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ(XMLHttpRequest)

  • CPU์˜ ๊ณ„์‚ฐ์— ์˜ํ•ด ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋™๊ธฐ์  ์ฝ”๋“œ์ด๋‹ค.

์ฝœ๋ฐฑ(Callback)

์ฝœ๋ฐฑ์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธ

  • ์ฝœ๋ฐฑ์„ ์ด์šฉ, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝœ๋ฐฑ์„ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

  • ์ฝœ๋ฐฑ๋งŒ์œผ๋กœ๋Š” ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์ฝœ๋ฐฑ ์ง€์˜ฅ ์ด๋ผ๋Š” ๋ง์ด ์ƒ๊ฒจ๋‚ฌ์Œ

  • ์ฝœ๋ฐฑ์ง€์˜ฅ: ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ต๋ช… ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜์–ด ์ฝ”๋“œ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ ์ •๋„๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ๊นŠ์–ด์ง€๋Š” ํ˜„์ƒ. ์ฝœ๋ฐฑ์ง€์˜ฅ ํ˜•ํƒœ๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ฝœ๋ฐฑ ์ง€์˜ฅ ํ•ด๊ฒฐ์„ ์œ„ํ•ด

Promise, Generator (ES6)

async/await (ES2017)

๋“ฑ์ด ๋„์ž…๋จ

TODO ์ฝœ๋ฐฑ ์˜ˆ์ œ ์ฝ”๋“œ ๋ณด์ถฉ ํ•„์š”

Promise

์ฝœ๋ฐฑ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Promise ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋“ฑ์žฅํ•จ

Promise๋Š” '์–ธ์  ๊ฐ€ ๋๋‚˜๋Š” ์ž‘์—…'์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‹ด๋Š” ํ†ต ๊ฐ™์€ ๊ฐ์ฒด์ด๋‹ค.

  • then ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•ด์„œ, ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ Promise.resolve ๋ผ๋Š” ์ •์ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด Promise ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

  1. Promise ์ƒ์„ฑ์ž๋Š” ์ฝœ๋ฐฑ์„ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค. ์ด ์ฝœ๋ฐฑ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ resolveํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ์ฝœ๋ฐฑ ์•ˆ์—์„œ resolve๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด resolve์— ์ธ์ˆ˜๋กœ ์ค€ ๊ฐ’์ด ๊ณง Promise ๊ฐ์ฒด์˜ ๊ถ๊ทน์ ์ธ ๊ฒฐ๊ณผ๊ฐ’์ด ๋œ๋‹ค. (๋‘๋ฒˆ์งธ ์ธ์ˆ˜๋กœ๋Š” reject ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์ด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.)

  2. Promise ๊ฐ์ฒด์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•ด ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜๋ ค๋ฉด then ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. then ๋ฉ”์†Œ๋“œ์— ์ฝœ๋ฐฑ์„ ๋„˜๊ฒจ์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋“ค์–ด์˜จ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Promise(1)
const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('2์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.');
    resolve('hello');
  }, 2000);
}); // 2์ดˆ ๋’ค ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๊ณ  resolve ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด p๋ณ€์ˆ˜์— ์ €์žฅ๋œ Promise ๊ฐ์ฒด๋Š” ๊ฒฐ๊ณผ๊ฐ’ 'hello'์„ ๊ฐ–๋Š” ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

// then ๋ฉ”์†Œ๋“œ๋„ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const p2 = p.then((msg) => {
  // then ๋ฉ”์†Œ๋“œ์— ์ฝœ๋ฐฑ์„ ๋„˜๊ฒจ์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋“ค์–ด์˜จ (Promise ๊ฐ์ฒด)๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  return msg + ' world'; // msg๋Š” p์— ๋‹ด๊ธด Promise ๊ฐ์ฒด ๊ฒฐ๊ณผ๊ฐ’์ด์—ˆ๋˜ 'hello'
});

p2.then((msg) => {
  // then ๋ฉ”์†Œ๋“œ์— ์ฝœ๋ฐฑ์„ ๋„˜๊ฒจ์„œ (Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์•„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”)p2 ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋˜ ์ถ”๊ฐ€ ์ž‘์—…!
  console.log(msg); // hello world
});
// ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Promise(2)

// Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('${ms} ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.'); // ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์ด๋ฏธ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ/๋ณ€ํ™˜ ๋˜์„œ ๊ฒฐ๊ณผ์— ${ms} ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฑด๊ฐ€?(TODO)
      console.log(ms);
      resolve();
    }, ms);
  });
}
// delay()๋Š” Promise ํ†ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
// ms ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
// resolve();๋ฅผ ํ†ตํ•ด Promise ํ†ต์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

delay(1000)
  .then(() => delay(2000))
  .then(() => Promise.resolve('๋'))
  .then((msg) => {
    console.log(msg);
  });

// ๋งจ ์•„๋ž˜ then์€
// .then(console.log); ๋กœ ์ค„์—ฌ์“ธ ์ˆ˜ ์žˆ์Œ

console.log('์‹œ์ž‘');

์œ„ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์‹œ์ž‘
${ms} ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.
1000
${ms} ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.
2000
๋

์ฝ”๋“œ ์„ค๋ช…

1์ดˆ ์žˆ๋‹ค๊ฐ€ delay() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์œ„ 1์ดˆ๊ฐ€ ๊ฐ€๊ธฐ ์ „์— console.log('์‹œ์ž‘') ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

resolve ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐ˜ํ™˜๋œ Promise ๊ฐ์ฒด๋ฅผ ์ด์šฉ, then ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ delay(2000)์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค. 2์ดˆ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ delay() ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋ฐ˜ํ™˜๋œ Promise ๊ฐ์ฒด๋ฅผ ์ด์šฉ, then ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฒˆ์—” resolve๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ '๋'์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง„ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.

์œ„ Promise ๊ฐ์ฒด๋ฅผ ์ด์šฉ, then ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ Promise์˜ ์‚ฌ์šฉ

axios๋Š” Javascript๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

axios.get() -> GET ๋ฉ”์†Œ๋“œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ -> Promise ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋จ

// HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ Promise์˜ ์‚ฌ์šฉ
const axios = require('axios');
const API_URL = 'https://api.github.com';

axios
  .get(`${API_URL}/repos/facebookincubator/create-react-app/issues?per_page=5`) // ํ•ด๋‹น ์ฃผ์†Œ์— get์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ด๊ธด Promise ํ†ต์ด ๋ฐ˜ํ™˜๋œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์€ Response ๊ฐ์ฒด์ด๋‹ค.(HTTP ์‘๋‹ต์— ๋Œ€ํ•œ ๋‚ด์šฉ)
  .then((res) => {
    // ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ res์— ๋‹ด๊ธด๋‹ค
    res.data
      .map((issue) => issue.title)
      .forEach((title, index) => console.log(index + 1 + ' : ' + title));
  });

Promise์˜ ์žฅ์ 

  • then ๋ฉ”์†Œ๋“œ๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ์ฝœ๋ฐฑ์„ ์ค‘์ฒฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์—ฐ๋‹ฌ์•„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ฐ’์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

TODO

Promise.all ๋ฉ”์†Œ๋“œ -> Iterator, Iterableํ•œ ๊ฐ์ฒด์˜ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

Promise.race

Promise ์ƒํƒœ(3๊ฐ€์ง€) - pending, settled(fulfilled, rejected)

Promise ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(reject ๊ด€๋ จ)

Reference

ํ”„๋ก ํŠธ์—”๋“œ ๋ฉด์ ‘ ์ž๋ฃŒ, Asynchronous

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ES6 ํ”„๋กœ๋ฏธ์Šค(Promise), ์ง„์งœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ (Promise์˜ ๋ชฉ์ ๋งŒ ์ƒ๊ฐํ•œ๋‹ค.)

[JavaScript] ES6 ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!!

JavaScript ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ promise ์ดํ•ดํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Promise ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

๋„์„œ, ์ฝ”์–ด์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

Q&A

ํŒ€์›๋“ค ๊ฒฐ๊ณผ๋ฌผ ๋ฐ ์งˆ์˜์‘๋‹ต&์ฝ”๋“œ๋ฆฌ๋ทฐ

์œ ๋ฆผ

https://github.com/pul8219/TIL/blob/master/Documents/FrontEnd-Study/step7.md

to ์œ ๋ฆผ

[์งˆ๋ฌธ-์€์˜]

๋ฉ”์ดํ”Œ ์‹œ๋Ÿฝ ๊ตฌ๋งค, ๋ฐ˜์ฃฝ, ์ƒํฌ๋ฆผ ํœ˜ํ•‘ ์— ๋Œ€ํ•œ ์˜ˆ์ œ๊ฐ€ ์ธ์ƒ ๊นŠ์–ด์š”

๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ์˜ ์˜ˆ

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•ด ํŠน์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผ๋˜๊ธฐ ์ „๊นŒ์ง€ ์–ด๋–ค ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๋ณด๋ฅ˜ํ•˜๋Š” ๊ฒฝ์šฐ(setTimeout)
์‚ฌ์šฉ์ž์˜ ์ง์ ‘ ๊ฐœ์ž…์ด ์žˆ์„ ๋•Œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋Œ€๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ(addEventListner)
์›น๋ธŒ๋ผ์šฐ์ € ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋Œ€์ƒ์— ์–ด๋–ค ์ผ์„ ์š”์ฒญํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์™”์„ ๋•Œ ๋น„๋กœ์†Œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋Œ€๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ(XMLHttpRequest)
CPU์˜ ๊ณ„์‚ฐ์— ์˜ํ•ด ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ์ ์ธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋™๊ธฐ์  ์ฝ”๋“œ์ด๋‹ค.

console.log('${ms} ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.'); // ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์ด๋ฏธ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ/๋ณ€ํ™˜ ๋˜์„œ ๊ฒฐ๊ณผ์— ${ms} ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฑด๊ฐ€?(TODO)

์ด๋Ÿฐ ์˜๋ฌธ์ ์„ ๊ฐ€์ ธ๋ณด๋Š” ์Šต๊ด€์ด ์ข‹์€๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ํƒฌํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์“ธ ๋•Œ๋Š” `` backtick ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” '' ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ€ ${ms} ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋˜์—ˆ๋„ค์š”

[๋‹ต๋ณ€]

@eyabc

ํ—. ` (backtick) ์š”๊ณ  ๋ง์”€์ด์‹œ๊ตฐ์š”! ์ง€๊ธˆ๊นŒ์ง€ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ์“ธ ๋•Œ๋งˆ๋‹ค ์™œ ์•ˆ๋˜์ง€ ์™œ ์•ˆ๋˜์ง€ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹) ์€์˜๋‹˜ ๋•์— JS ์ดˆ๋ณด๋Š” ๋งŽ์€ ๊ฑธ ์•Œ์•„๊ฐ‘๋‹ˆ๋‹ค... ๐Ÿ‘ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๊ด€๋ จํ•ด์„œ๋Š” ๋” ์•Œ์•„๋ณด๊ณ  Javascript ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹ ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค ๋ฆฌ๋ทฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์€์˜

https://eyabc.github.io/Doc/dev/core-javascript/%EB%B9%84%EB%8F%99%EA%B8%B0%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.html#motivation-%ED%83%80%EC%9D%B4%EB%A8%B8-api

to ์€์˜

[์งˆ๋ฌธ]

๋ธŒ๋ผ์šฐ์ €๊ฐ€ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ํ˜ธ์ถœ ์Šคํƒ์˜ ๋ณ€ํ™”
1.์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œ ํ•  ๋•Œ
- ์ „์—ญ์‹คํ–‰๋งฅ๋ฝ(Global Execution Context) ์„ ํ˜ธ์ถœ ์Šคํƒ์— push
2.ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ
- ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์‹คํ–‰ ๋งฅ๋ฝ ์ƒ์„ฑ
- ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์‹คํ–‰ ๋งฅ๋ฝ์„ ํ˜ธ์ถœ ์Šคํƒ์— push
3.ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚  ๋•Œ
- ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜
- ํ˜ธ์ถœ ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์‹คํ–‰ ๋งฅ๋ฝ pop
4.์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰์ด ๋ชจ๋‘ ๋๋‚  ๋•Œ
- ์ „์—ญ ์‹คํ–‰ ๋งฅ๋ฝ์„ ํ˜ธ์ถœ ์Šคํƒ์—์„œ pop
์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜ธ์ถœ ์Šคํƒ์— ์‹คํ–‰ ๋งฅ๋ฝ์ด ์กด์žฌํ•˜๋Š” ๋™์•ˆ(์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ) ๋จนํ†ต์ด ๋œ๋‹ค.

- ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์‚ฌ์œจ, ๋ณดํ†ต 60fps, ๋Œ€๋žต 16 ms ์•ˆ์— ์ฝ”๋“œ ์‹คํ–‰์„ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด
  - ๋ธŒ๋ผ์šฐ์ € ๋‚ด ์• ๋‹ˆ๋งค์ด์…˜์ด ๋š๋š ๋Š๊ธฐ๋Š” ํ˜„์ƒ
  - ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์•…์˜ํ–ฅ

์œ„ ๋‚ด์šฉ์ด ์ž์„ธํ•˜๊ฒŒ ์„œ์ˆ ๋˜์–ด์žˆ์–ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ˜ธ์ถœ์Šคํƒ๊ณผ ์ž‘์—…ํ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”์–ด ์ผ๋Š”๋ฐ ์ „์—ญ ์‹คํ–‰ ๋งฅ๋ฝ๊นŒ์ง€ ๊ณ ๋ คํ•ด Javascript ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์—ฐ๊ฒฐ์ง€์–ด ์ •๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ์€์˜๋‹˜ ๊ธ€ ์ฐธ๊ณ ํ•ด์„œ ์ œ ๊ฒƒ๋„ ๋ณด์™„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


Motivation - ํƒ€์ด๋จธ API ๋‚ด์šฉ ์ค‘) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋…์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์™€ node.js ์—์„œ ๋ถ€ํ„ฐ ์™”๋‹ค. ๋ชฐ๋ž๋˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค ..!


Promise ๋‚ด์šฉ ์ค‘ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ hello๊ฐ€ ์–ด๋–ป๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฑด๊ฐ€์š”? 'hello'๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋‹ด์€ ๊ฐ์ฒด ๋ฐ˜ํ™˜์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

let promise = new Promise(resolve => {
  setTimeout(() => resolve("done!"), 1000);
});

promise.then(alert); // 1์ดˆ ๋’ค "done!" ์ถœ๋ ฅ

promise.then(msg => {
  console.log(msg); // hello
});

[๋‹ต๋ณ€]

@pul8219 ์ž๋ฃŒ๋“ค์„ ๋ณต๋ถ™ ํ•˜๋‹ค๋ณด๋‹ˆ ์‹ค์ˆ˜๊ฐ€ ์ƒ๊ฒผ๋„ค์š” ใ…‹ใ…‹ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ •์›…

https://jeongshin.github.io/JeongShin_Blog/TIL/study/NodeJS.html

๋…ธ์›

https://github.com/quavious/hell_script/blob/master/chapter7.js

to ๋…ธ์›

[์งˆ๋ฌธ]

์•Œ์•„๊ฐ‘๋‹ˆ๋‹ค!

  • this๋ฅผ ํ†ตํ•ด ํƒ€์ด๋จธ ๋๋‚ด๊ธฐ
//setInterval์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ function(){...}์„ ๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๋‹น function์€ setInterval ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋œ๋‹ค.
//์ฆ‰, ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด ์ž‘์„ฑ๋œ this๋Š” ์‹คํ–‰๊ฐ์ฒด, setInterval ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ , this๋ฅผ ํ†ตํ•ด ๋ณ„๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์„ ์–ธ ์—†์ด๋„
//ํ•จ์ˆ˜๋ฅผ ๋๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

let i = 0;
setInterval(function () {
  i++;
  console.log(i);
  if (i === 5) {
    clearInterval(this);
  }
}, 2000);
//5๊นŒ์ง€ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๊ณ  ์ข…๋ฃŒ๋œ๋‹ค.
  • async, await์˜ ์ดํ•ด
async function fetchAPI() {
  const resp = await Axios.get('https://example.com');
  console.log(resp.status);
  // example.com์— http ์š”์ฒญ ๋ฐ ๊ฐ’ ๋ฐ˜ํ™˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ console.log๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
}
function withAsyncFunc() {
  fetchAPI();
  console.log(1000);
}
//withAsyncFunc()
// 1000์ด ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  ๊ทธ ๋‹ค์Œ fetchAPI, ๋น„๋™๊ธฐ์  ๋ฉ”์†Œ๋“œ์— ์žˆ๋Š” console.log(resp.status)๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
// async ํ•จ์ˆ˜ ๋‚ด์—์„  await์˜ ์กด์žฌ ๋•๋ถ„์— Get ์š”์ฒญ์ด ์™„๋ฃŒ๋œ ์งํ›„ resp.status๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

// async await์œผ๋กœ ๋น„๋™๊ธฐ์‹ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
async function withAsyncFunc() {
  await fetchAPI();
  console.log(1000);
}
withAsyncFunc();
// fetchAPI ํ•จ์ˆ˜์— await์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ resp.status๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ๋œ ํ›„ 1000์ด ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜์˜€๋‹ค.

์•„๋ž˜ ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ์Šคํƒ, ์ž‘์—…ํ ์˜ ๋ณ€ํ™” ๋“ฑ๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•จ๊ป˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

function func() {
  console.log(1);
  setTimeout(function () {
    console.log(2);
  }, 0);
  console.log(3);
}
//func() // func ํ•จ์ˆ˜๋Š” 1, 2, 3์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. setTimeout์— ์ „๋‹ฌ๋œ ์ธ์ž๊ฐ€ 0์ด๋ผ๋„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
// ์ฝ˜์†”์—๋Š” 1, 3, 2๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค

ํ˜•์šฑ

https://github.com/khw970421/js-interview/blob/master/const/project7.js https://github.com/khw970421/js-interview/blob/master/const/project7.5.js https://github.com/khw970421/js-interview/blob/master/const/project7_total.js

to ํ˜•์šฑ

[์งˆ๋ฌธ]

๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ• ๊ฒƒ ๋ถ€๋ถ„์ด ๋„์›€์ด ๋งŽ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

//๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ• ๊ฒƒ
const ex = function () {};
console.log(function () {}); //[Function (anonymous)] => ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.    (ํ•จ์ˆ˜์˜ ์‹คํ–‰์—†์ด ํ•จ์ˆ˜์ž์ฒด๋ฅผ ๋ฆฌํ„ด)
console.log(() => {}); //[Function (anonymous)] => ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.    (ํ•จ์ˆ˜์˜ ์‹คํ–‰์—†์ด ํ•จ์ˆ˜์ž์ฒด๋ฅผ ๋ฆฌํ„ด)
console.log(ex); //[Function: ex]         => ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.    (ํ•จ์ˆ˜์˜ ์‹คํ–‰์—†์ด ํ•จ์ˆ˜์ž์ฒด๋ฅผ ๋ฆฌํ„ด)
console.log(ex()); //undefined              => ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์–ด์„œ undefined์ด๋‹ค.(ํ•จ์ˆ˜์˜ ์‹คํ–‰ ํ›„  ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฆฌํ„ด)

//์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€ ํŠน์ • ์ฝ”๋“œ์˜ ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.
//setTimeout ์˜ˆ์‹œ
const later_hi = () => {
  console.log('1์ดˆ๋’ค ใ…Žใ…‡');
};
setTimeout(later_hi, 1000); //'1์ดˆ๋’ค ใ…Žใ…‡'
//setTimeout(later_hi(),1000);      // error    =>later_hi()์˜ ๋ฐ˜ํ™˜๊ฐ’์ด undefiend์ด๋ฏ€๋กœ ์Šค์ผ€์ค„๋ง ๋Œ€์ƒ์„ ์ฐพ์ง€๋ชปํ•จ

๋‚ด๊ฐ€ setTimeout() ๋“ฑ์˜ ํƒ€์ด๋จธ๋‚˜ ์ฝœ๋ฐฑ์˜ ๋น„๋™๊ธฐ์  ์ง„ํ–‰์„ ๊ณต๋ถ€ ๋” ํ•ด์•ผ๋ ๋“ฏ!


์ œ๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์ด ๋งž๋Š”์ง€ ๊ถ๊ธˆํ•˜์—ฌ ๋“œ๋ฆฌ๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค

// setTimeout
class ash1 {
  hp = 15;
}
const a1 = new ash1();
const di1 = setTimeout(dinomit1, 1000);
function dinomit1() {
  console.log('clearTimeout ์œผ๋กœ ์ธํ•ด ์ถœ๋ ฅ x');
}
clearTimeout(di1); //di1์— ๋ฐ˜ํ™˜๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค๊ฐ€ clearTimeout์œผ๋กœ 8๋ฐ˜ํ™˜๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ํƒ€์ด๋จธ ์ทจ์†Œ

ํ˜น์‹œ ์œ„ ์˜ˆ์ œ์—์„œ console.log('clearTimeout ์œผ๋กœ ์ธํ•ด ์ถœ๋ ฅ x');๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ dinomit1()ํ•จ์ˆ˜๋ฅผ 1์ดˆ ๋’ค์— ์‹คํ–‰ํ•˜๋ ค๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ์ด์— clearTimeout(di1); ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ธ๊ฐ€์š”? ๊ทธ๋ฆฌ๊ณ  ํƒ€์ด๋จธ ์‹๋ณ„์ž๊ฐ€ di1์— ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ๊ธฐ๊ฐ€ const di1 = setTimeout(dinomit1, 1000); ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

[๋‹ต๋ณ€]

pul8219๋‹˜ ๋„์›€์ด๋˜์–ด์„œ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ์ฒซ๋ฒˆ์จฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์œผ๋กœ๋Š” ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ clearTimeout(di1)์„ dinomit()ํ•จ์ˆ˜์•ˆ์— ๋„ฃ๋Š”๋‹ค๋ฉด

class ash1 {
  hp = 15;
}
const a1 = new ash1();
const di1 = setTimeout(dinomit1, 1000);
function dinomit1() {
  clearTimeout(di1); //di1์— ๋ฐ˜ํ™˜๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค๊ฐ€ clearTimeout์œผ๋กœ 8๋ฐ˜ํ™˜๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ํƒ€์ด๋จธ ์ทจ์†Œ
  console.log('clearTimeout ์œผ๋กœ ์ธํ•ด ์ถœ๋ ฅ x');
}

๊ฒฐ๊ณผ๋Š” clearTimeout ์œผ๋กœ ์ธํ•ด ์ถœ๋ ฅ x ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ 1์ดˆ๋’ค์— ์‹คํ–‰ํ•˜๊ธฐ ์ „์— clearTimeout์ด ์‹คํ–‰๋˜๊ธฐ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๋ด์•ผํ• ๊ฒƒ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ ์งˆ๋ฌธ์€ ์ €๋„ ํฅ๋ฏธ๋กœ์›Œ์„œ

// setTimeout
class ash1 {
  hp = 15;
}
const a1 = new ash1();
const di1 = setTimeout(dinomit1, 1000);
function dinomit1() {
  console.log('clearTimeout ์œผ๋กœ ์ธํ•ด ์ถœ๋ ฅ x');
}
console.log(di1);
clearTimeout(di1); //di1์— ๋ฐ˜ํ™˜๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค๊ฐ€ clearTimeout์œผ๋กœ 8๋ฐ˜ํ™˜๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ํƒ€์ด๋จธ ์ทจ์†Œ
console.log(di1);

์ด๋Ÿฐ์‹์œผ๋กœ di1์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ๋ฒˆ ๋ณด๊ณ  clearTimeout ํ›„์— di1์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณธ ๊ฒฐ๊ณผ

  _idleTimeout: 1000,
  _idlePrev: [TimersList],
  _idleNext: [TimersList],
  _idleStart: 162,
  _onTimeout: [Function: dinomit1],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(asyncId)]: 2,
  [Symbol(triggerId)]: 1
}
Timeout {
  _idleTimeout: -1,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 162,
  _onTimeout: null,
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: true,
  [Symbol(refed)]: true,
  [Symbol(asyncId)]: 2,
  [Symbol(triggerId)]: 1
}
Process finished with exit code 0

์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ• ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ผ๋‹จ ์ค‘์š”ํ•œ๊ฑด ์ฒซ๋ฒˆ์งธ์˜ idleTimeout์ด 1000์—์„œ -1์ด ๋œ๊ฒƒ์„ ๋ณด๋ฉฐ clearTimeout์œผ๋กœ ์ธํ•ด ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๊ฒƒ์„ ์•Œ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ "di1์— ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ๊ธฐ๊ฐ€ const di1 = setTimeout(dinomit1, 1000); ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ธ์ง€ " ์— ๋Œ€ํ•œ ๋‹ต์€ ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„๋•Œ di1์— ์ €๋Ÿฐ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ di1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ผ๋Š” ๋‚ด์šฉ์ด di1์— ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค? ๋ผ๋Š” ์˜๋ฏธ๋ผ๋ฉด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ( ํ˜น์‹œ ์ œ๊ฐ€ํ•œ ์„ค๋ช…์ด ์–ด๋ ค์šฐ์‹œ๋ฉด ํ•œ๋ฒˆ ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ์ดํ•ดํ•˜๋Š”๊ฒƒ๋„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ดœ์ฐฎ์„๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)


//์ด๋ ‡๊ฒŒ๋„ ๋น„๋™๊ธฐ(hํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ์ „์— ๋‚ด๋ถ€ํ•จ์ˆ˜๋“ค์ด ์ฒ˜๋ฆฌ)์ด์ง€๋งŒ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์— a,b๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋‚˜์˜จ๋‹ค.
function h(callback) {
  let a = 100,
    b = 150;
  callback(a);
  callback(b);
}
h(function (value) {
  console.log(value);
});

callback(a); callback(b); ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜?

function test(callback) {
  console.log('์ฝœ๋ฐฑํ•จ์ˆ˜์•ˆ');
  callback();
}
test(function () {
  console.log('์ด๋ถ€๋ถ„์ด ์ฝœ๋ฐฑ');
});

๊ฒฐ๊ณผ ์˜ˆ์ธกํ•ด๋ณด๊ธฐ!