BKJang / do-you-know-vanilla

๐ŸŒ This repository contains contents about Vanilla JS and project developed with Vanilla JS.
https://bkjang.github.io/do-you-know-vanilla
11 stars 1 forks source link

Event Loop #5

Open BKJang opened 5 years ago

BKJang commented 5 years ago

๐Ÿ™ Reference

BKJang commented 5 years ago

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜์ด๋‹ค.

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

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™๋‹ค.

eventLoop

์šฐ์„ , ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณธ ํ›„, ์ „์ฒด์ ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

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

Heap

๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋Š” Heap์— ํ• ๋‹น์ด ๋œ๋‹ค. Heap์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋Œ€๋ถ€๋ถ„ ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

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

ํ˜ธ์ถœ ์Šคํƒ์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Stack์ด๋ฉฐ LIFO(Last-In-First-Out)๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด(์ž‘์—…์„ ์š”์ฒญํ•˜๋ฉด) ์ž‘์—…์€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์— ์Œ“์ด๊ณ  ์‹คํ–‰๋œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•˜๋‚˜์˜ ์Šคํƒ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

Web APIs

ํ”ํžˆ WebAPI๋ผ ๋ถˆ๋ฆฌ๋Š” API๋“ค์€ ์‹คํ–‰ํ™˜๊ฒฝ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.

์ด๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” Web API์˜ ๋‚ด๋ถ€๋Š” ์กฐ์ž‘ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ˜ธ์ถœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

Web API์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฝœ๋ฐฑํ•จ์ˆ˜

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

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

Event Queue(์ด๋ฒคํŠธ ํ)

์ด๋ฒคํŠธ ํ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” Queue์ด๋ฉฐ FIFO(First-In-First-Out)์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์›Œ์งˆ ๋•Œ๋งˆ๋‹ค ํ์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šคํƒ์— ๋„ฃ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์ค€๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ

์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์—ญํ• ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•œ๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์— ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์ด ์žˆ๋Š”์ง€, ์ด๋ฒคํŠธ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—…์ด ์žˆ๋Š”์ง€ ๋ฐ˜๋ณตํ•ด์„œ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ์— ์žˆ๋Š” ์ž‘์—…์„ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์˜ฎ๊ธด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ํ˜ธ์ถœ ์Šคํƒ์ด๋‹ค.

function func1() {
  console.log('func1');
  func2();
}

function func2() {
  setTimeout(function () {
    console.log('func2');
  }, 0);

  func3();
}

function func3() {
  console.log('func3');
}

func1();

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

์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ์œ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค€๋‹ค.

event_loop_gif

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://poiemaweb.com/js-event


์œ„ ๊ณผ์ •์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. func1ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์ด๋Š” ํ˜ธ์ถœ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€๊ณ  console.log('func1')์ด ์‹คํ–‰๋œ๋‹ค.
  2. func2ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€๊ณ  setTimoutํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  3. ํ˜ธ์ถœ๋œ setTimeoutํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰์€ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Web API์— ๋„˜์–ด๊ฐ„๋‹ค.
  4. func3ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€๊ณ  console.log('func3')์ด ์‹คํ–‰๋œ๋‹ค.
  5. Web API์—์„œ setTimoutํ•จ์ˆ˜์—์„œ ์ง€์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด callbackํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ๋กœ ๋„˜๊ธด๋‹ค.
  6. ์ž‘์—…์ด ๋๋‚œ func3, func2, func1์€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  7. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํ˜ธ์ถœ ์Šคํƒ์— ์ž‘์—… ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฒคํŠธ ํ์— ์žˆ๋Š” callbackํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค.
  8. ํ˜ธ์ถœ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ„ callbackํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ console.log('func3')๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์œ„ ์„ค๋ช…์—์„œ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณผ ๊ฒƒ์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeoutํ•จ์ˆ˜์— ์„ธํŒ…๋œ ์‹œ๊ฐ„์ด 3์ดˆ๋ผ๋ฉด 3์ดˆ ํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ผ๊ฐ€ ์•„๋‹Œ 3์ดˆ ํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ์— ๋„ฃ์–ด๋ผ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, setTimeout ํ•จ์ˆ˜๋Š” n์ดˆ ๋’ค์— ์ฝœ๋ฐฑ์„ ๋‹จ์ˆœํžˆ ํ์— ์ง‘์–ด๋„ฃ๋Š”๊ฒŒ ๋์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

var eventLoop = [];
var event;

while (true) {
  // ํ‹ฑ!
  if (eventLoop.length > 0) {
    event = eventLoop.shift();
  }

  try {
    event(); // ํ˜ธ์ถœ์Šคํƒ์œผ๋กœ ๋ฐ€์–ด๋„ฃ๋Š”๋‹ค
  } catch (err) {
    //...
  }
}

์ด ํ์— ์ด๋ฏธ ๋Œ€๊ธฐ๋ฒˆํ˜ธ๊ฐ€ 100๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด func3๋Š” 101๋ฒˆ์งธ ๋Œ€๊ธฐํ‘œ๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ setTimeout์€ ์ง€์ •ํ•œ ์‹œ๊ฐ„๋™์•ˆ์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€์ •ํ•œ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๋Š”๊ฒƒ์€ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

while (await messageQueue.nextMessage()) {
  let message = messageQueue.shift();
  message.run();
}

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋ฉ”์‹œ์ง€ ํ์— ๋ฉ”์‹œ์ง€๊ฐ€ ๋” ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฃจํ”„์ด๋‹ค.

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

ES6์ดํ›„์˜ ๋ณ€ํ™”๋œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์ด ํฐ ํ‹€์ด๋‹ค. ํ์™€ ์Šคํƒ์„ ๊ฐ์‹œํ•˜๋ฉฐ ์Šคํƒ์˜ ์ž‘์—…์ด ์—†์œผ๋ฉด ํ์˜ ์ž‘์—…์„ ์Šคํƒ์— ์˜ฌ๋ฆฐ๋‹ค. ๋‹ค๋งŒ, ES6์ดํ›„์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋น„๋™๊ธฐ์  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” API๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ์ด์— ๋”ฐ๋ผ ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€๋œ ๋‚ด์šฉ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ „์ฒด์ ์ธ ์‹คํ–‰ ๋ฐฉ์‹์€ ๋™์ผํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ˆ˜ํ–‰ ์ˆœ์„œ์— ์ดˆ์ ์„ ๋‘๊ณ  ์‚ดํŽด๋ณด์ž.

๊ธฐ์กด์— ์‚ดํŽด๋ณด์•˜๋˜ ์ด๋ฒคํŠธ ํ(Event Queue)๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ๋‚˜๋ˆ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Task Queue : ๊ฐ€์žฅ ์‚ฌ๋žŒ๋“ค์ด ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ธ setTimeout์ด ๋“ค์–ด๊ฐ€๋Š” ํ
  2. Micro Task Queue : ES6์—์„œ ์ถ”๊ฐ€๋œ Promise์™€ ES8์˜ Async Await(Async Await๋„ ๊ฒฐ๊ตญ Promise)
  3. AnimationFrame: requestAnimationFrame(rAF)์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
console.log("script start");

setTimeout(function() {
  console.log("setTimeout");
}, 0);

Promise.resolve().then(function() {
  console.log("promise1");
}).then(function() {
  console.log("promise2");
});

requestAnimationFrame(function {
    console.log("requestAnimationFrame");
})
console.log("script end");

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

script start
script end
promise1
promise2
requestAnimationFrame
setTimeout

์ฆ‰, ์ด๋ฒคํŠธ ํ์—์„œ ๋‚˜๋ˆ ์ง€๋Š” 3๊ฐ€์ง€ ์˜์—ญ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Micro Task Queue => AnimationFrame => Task Queue

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

  1. ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” ์ž‘์—…์€ Task์™€ Micro Task, ๊ทธ๋ฆฌ๊ณ  AnimationFrame์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
  2. Micro Task๋Š” Task๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌ๋œ๋‹ค.
  3. Micro Task๊ฐ€ ์ฒ˜๋ฆฌ๋œ ์ดํ›„ requestAnimationFrame์ด ํ˜ธ์ถœ๋˜๊ณ  ์ดํ›„ ๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.