ES6+ blocking 과 non-blicking
자바스크립트 스레드에는
MAIN UI Thread
BACKGROUND Thread
WEB WORKER Thread
구성되어 있습니다.
1 2 3 4 5 6 7 | const looper = (n,f) => { for(let i=0; i<n; i++) f(i); } looper(5, console.log); looper(100000, console.log); | cs |
위 예제는 n 만큼 루프가 작동하는데 100000 만번이 작동하는동안 블럭되어있습니다.
그럼 이걸 어떻게 해결하느냐
Time slicing 이용하시면 됩니다.
1. Time slicing Manual
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | const looper = (n,f,slice=3) => { let limit=0, i=0; const runner = _ => { while(i<n) { if(limit++ < slice) f(i++); else { limit =0; console.log("i:"+i); requestAnimationFrame(runner); break; } } }; console.log("start"+i); requestAnimationFrame(runner); }; looper(9, console.log); console.log('ABC'); ABC undefined 0 1 2 i:3 3 4 5 i:6 6 7 8 | cs |
requestAnimationFrame 로 인해서 즉시 흐름제어로 제어권을 바로 받을수 있습니다.
[arrow 함수]
runner = function (n,f) {
}
runner = (n,f) => {
}
runner = _ => {
}
_ 인자하나인 변수 / 인자이름이 _ / 인자가 오긴 하는데 내부적으로 사용안할거임
https://www.youtube.com/watch?v=BeFekctVoq0
2. Time slicing Auto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | const looper = (n,f,ms=1000, i=0) => { let old = performance.now(), curr; const runner = _ => { while( i < n ) { curr = performance.now(); if( curr-old < ms ) f(i++); else { old = curr; console.log('i: '+i); requestAnimationFrame(runner); break; } } }; requestAnimationFrame(runner); }; looper(5, console.log); console.log('ABC'); | cs |
performance.now() 브라우져가 구동된후의 시간
'프로그래밍 > Js' 카테고리의 다른 글
JavaScript Lexical Grammar (0) | 2021.10.21 |
---|---|
ES6+ 2차원배열 foreach (0) | 2018.11.23 |
ES6+ html parser 재귀함수 (0) | 2018.11.23 |
async await promise 예제 (0) | 2018.11.21 |
ES6+ SYNC, ASYNC (block, non-block) (0) | 2018.11.21 |