연산이 오래걸리는 코드를 짤 때 최적화 하는 방법
- setTimeout 이용
- setTimeout()을 이용하여 0초마다 0~1억 반복, 1억~2억 반복,... 이런식으로 코드를 실행한다면 더 나은 작업속도를 기대할 수 있음.
- Web worker 이용
- 다른 자바스크립트 파일을 이용하여 그 파일에서 오래 걸리는 연산을 수행하게 하고, 완료되면 값을 가져오도록 짠다. (Worker 라는 클래스 이용)
(메인 js 파일) var myWorker = new Worker('worker.js'); w.onmessage = function(e){ console.log(e.data) }; (worker.js 파일) var i = 0; postMessage(i + 1); //postMessage라는 특별한 함수가 있음
이렇게 세팅하면, worker.js 파일에서 작업이 완료될 시, postMessage()를 실행하고 다른 파일로 완료된 결과값을 전달할 수 있게 된다.
console.log(1);
setTimeout(function(){}, 1000);
console.log(2);
이렇게 짜면 1초를 쉬고 2를 출력하는 것이 아닌, 1과 2를 동시에 출력한다
왜냐하면 setTimeout 이라는 함수는 읽는 시점과 동작 시점이 차이가 있는 함수인데, 이러한 함수들은 대기실인 Web API 에 옮겨서 대기시키기 때문이다.1초의 대기시간이 지난 뒤 setTimeout이 완료 되면 대기실에서 코드를 꺼내 코드가 실행되게 한다.
따라서 비동기를 지원하는 setTimeout 같은 함수를 이용하면 비동기식 처리도 가능하게 되는 것이다.
console.log(1);
setTimeout(function(){
console.log(2);
}, 1000);
console.log(3);
이렇게 setTimeout 안에 2를 출력하는 코드를 넣는다면, 1과 3이 먼저 출력되고 그 다음 1초 후 2가 출력된다.
콜백함수 디자인
function 첫째함수(콜백){ console.log(1); 콜백(); } function 둘째함수(){ console.log(2) } 첫째함수(둘째함수);
함수에 파라미터로 콜백함수를 넘겨 주는 식으로 짤 수 있고,
첫째함수(function(){ console.log(2) })
직접 함수 선언문을 넣어 실행할 수도 있다.
그런데,콜백함수를 쓰게 되면 코드가 옆으로 길어지는 단점이 있다.
첫째함수(function(){
둘째함수(function(){
셋째함수(function(){
어쩌구..
});
});
}):
이를 보완하기 위한 디자인 패턴이 바로 Promise 디자인 패턴이다.
첫째함수().then(function(){
그 담에 실행할거
}).then(function(){
그 담에 실행할거
});