Block, Non Block, Sync, Async - ChoDragon9/posts GitHub Wiki

์ œ์–ดํ๋ฆ„์€ ๋ธ”๋กํ‚น์ด๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰๋˜๋ฉด ๋„์ค‘์— ๋ฉˆ์ถฐ์ง€์ง€ ์•Š๊ณ  ๋๊นŒ์ง€ ์‹คํ–‰๋จ
  • ํ”Œ๋žซํผ์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๋ธ”๋ก๋˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ๋ฉด ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚ด(5์ดˆ ์ œํ•œ)
for(const i of (function*(){
  let i = 0;
  while(true) yield i++;
})()) console.log(i);

๋ธ”๋ก

  • ์ฆ‰์‹œ ํ”Œ๋กœ์šฐ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ
  • ๋””๋ฐ”์ด์Šค๋“ค์€ 60fps๋กœ ๋””์Šคํ”Œ๋ ˆ์ด๋จ
  • 1fps์— ๋”œ๋ ˆ์ด๋ฅผ ์ƒ๊ธฐ๋ฉด ๋ธ”๋กํ‚น์„ ์ผ์œผ์ผฐ๋‹ค๊ณ  ํ•œ๋‹ค.
const f = v=>{
  let i = 0;
  while(i++ < v);
  return i;
}
f(10);
f(100000000000000000000000);
  • ์ด ๊ฒฝ์šฐ ๋ธ”๋กํ‚น์ด ๋ฐœ์ƒ๋œ๋‹ค.
    • ๋ฐฐ์—ด์ˆœํšŒ, ์ •๋ ฌ => ๋ฐฐ์—ดํฌ๊ธฐ์— ๋”ฐ๋ผ
    • DOM ์ˆœํšŒ => DOM์˜ ํ•˜์œ„๊ตฌ์กฐ์— ๋”ฐ๋ผ
    • ์ด๋ฏธ์ง€ํ”„๋กœ์„ธ์‹ฑ => ์ด๋ฏธ์ง€ํฌ๊ธฐ์— ๋”ฐ๋ผ

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

  1. ๋ฉ”์ธ ์œ ์ €์ธํ„ฐํŽ˜์ด์ง€ ์“ฐ๋ ˆ๋“œ 1๊ฐœ
    • ํ”„๋ ˆ์ž„(๋ช…๋ นํ)
  2. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์“ฐ๋ ˆ๋“œ n๊ฐœ
  3. ์›น ์›Œ์ปค ์“ฐ๋ ˆ๋“œ

๋ธ”๋กํ‚น ํšŒํ”ผ

๋ธ”๋กํ‚น ํ•จ์ˆ˜

const looper = (n, f)=>{
  for(let i = 0; i < n; i++) f(i);
};
  1. ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค ๋ฉ”๋‰ด์–ผ
const looper = (n, f, slice = 3) => {
    let limit = 0,
        i = 0;
    const runner = _ => {
        while (i < n) {
            if (limit++ < slice) f(i++);
            else {
                limit = 0;
                requestAnimationFrame(runner);
                break;
            }
        }
    };
    requestAnimationFrame(runner);
};
  1. ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค ์˜คํ† 
const looper = (n, f, ms = 5000, i = 0) => {
    let old = performance.now(),
        curr;
    const runner = curr => {
        while (i < n) {
            if (curr - old < ms) f(i++);
            else {
                old = performance.now();
                requestAnimationFrame(runner);
                break;
            }
        }
    };
    requestAnimationFrame(runner);
};
  1. ์›น ์›Œ์ปค
const backRun = (f, end, ...arg) => {
    const blob = new Blob([`onmessage =e=>postMessage((${f})(e.data));`], {
        type: 'text/javascript'
    });
    const url = URL.createObjectURL(blob);
    const worker = new Worker(url); //new Worker("some.js");
    worker.onmessage = e => end(e.data);
    worker.onerror = e => end(null);
    worker.postMessage(arg);
};

๋…ผ ๋ธ”๋กํ‚น

์„œ๋ธŒ๋ฃจํ‹ด์ด ์ฆ‰์‹œ ํ”Œ๋กœ์šฐ ์ œ์–ด๊ถŒ์„ ๋‚ด๋†“๋Š” ๊ฒƒ

consta = 123;
looper(12, console.log);
backRun(v => v[0] + v[1], console.log, 3, 5);
console.log(a); //์–ด์จŒ๋“ ์ฝ˜์†”์€123๋ถ€ํ„ฐ์ถœ๋ ฅ

์‹ฑํฌ

์„œ๋ธŒ๋ฃจํ‹ด์ด ์ฆ‰์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

const double = v=>v*2;
console.log(double(2)); //4

์–ด์‹ฑํฌ

์„œ๋ธŒ๋ฃจํ‹ด์ด ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

const double = (v, f)=>f(v*2);
double(2, console.log); //4

์š”์•ฝ

  • ์‹ฑํฌ : ์„œ๋ธŒ๋ฃจํ‹ด์ด ์ฆ‰์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ
  • ์–ด์‹ฑํฌ : ์„œ๋ธŒ๋ฃจํ‹ด์ด ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ
  • ๋ธ”๋ก : ์ฆ‰์‹œ ํ”Œ๋กœ์šฐ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ
  • ๋…ผ๋ธ”๋ก : ์ฆ‰์‹œ ํ”Œ๋กœ์šฐ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•จ
  • ์‹ฑํฌ&๋ธ”๋ก : normalAPI, legacyAPI
  • ์‹ฑํฌ&๋…ผ๋ธ”๋ก : old API(img.complete)
  • ์–ด์‹ฑํฌ&๋ธ”๋ก : TRAP
  • ์–ด์‹ฑํฌ&๋…ผ๋ธ”๋ก : modern API