코드스피츠73 part5
BLOCK, NONBLOCK
BLOCKING EVASION -> NONBLOCKING
서브루틴이 즉시플로우 제어권을 내놓는것
1 2 3 4 5 6 7 8 9
| const a=123;
looper(12, console.log);
backRun(v=>v[0] + v[1], console.log, 3, 5);
console.log(a);
|
SYNC, ASYNC
병행성 프로그래밍에 익숙해져야 된다.
SYNC
서브루틴이 즉시값을 반환함
1 2 3 4 5 6
| const double = v=>v*2;
console.log(double(2));
|
block 즉시 플로우 제어권을 반환하지 않음
1 2 3 4 5 6 7 8 9 10
| const sum = n=>{ let sum = 0; for(let i = 1; i <= n; i++) sum += i; return sum; };
sum(100);
|
non block즉시플로우제어권을반환함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const sum = n=>{ const result = {isComplete:false}; requestAnimationFrame(_=>{ let sum = 0; for(let i = 1; i <= n; i++) sum += i; result.isComplete = true; result.value = sum; }); return result; };
const result = sum(100);
while(!result.isComplete); console.log(result.value);
|
ASYNC
서브루틴이 콜백을 통해 값을 반환함
1 2 3 4 5
| const double = (v, f)=> f(v*2);
double(2, console.log);
|
block 즉시 플로우 제어권을 반환하지 않음
1 2 3 4 5 6 7 8 9 10 11
| const sum = (n, f)=>{ let sum = 0; for(let i = 1; i <= n; i++) sum += i; return f(sum); };
sum(10, console.log); console.log(123);
|
non block즉시플로우제어권을반환함
1 2 3 4 5 6 7 8 9 10 11 12 13
| const sum = (n, f)=>{ requestAnimationFrame(_=>{ let sum = 0; for(let i = 1; i <= n; i++) sum += i; f(sum); }); };
sum(10, console.log); console.log(123);
|
루프를 짤때 블럭가드를 항상 설치한다.
1 2 3 4 5 6 7 8 9
| for(let i = 0; i <= arr.length, limit = 50000; limit-- >0 && i<j; i++){
}
if(limit < 0){
}
|
callback 함수는 리턴 받는 함수를 캡슐화 하기 위해서
SIMILAR ASYNC-BLOCK 미루기 패턴
1 2 3 4 5 6 7 8 9 10 11 12 13
| const sum = (n, f)=>{ requestAnimationFrame(_=>{ let sum = 0; for(let i = 1; i <= n; i++) sum += i; f(sum); }); };
sum(100000000, console.log); console.log(123);
|
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
| 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); worker.onmessage =e=>end(e.data); worker.onerror =e=>end(null); worker.postMessage(arg); };
const f = v=>{ for(let i = 1, sum = 0; i <= v[0]; i++){ sum += i; } return sum; };
let i=1000;
while(i--) backRun(f, console.log, 100000);
|
참조