setTimeout(func, millisec)
setTimeout()은 어디선가 그리고 아무래도 익숙한 느낌이다. 뭔가 시간과 관련된 함수일 것 같은 그런 느낌. 그리고 그 느낌이 맞다. 원하는 시간을 설정하면 그 시간이 지난 후 함수를 실행하게 된다.
포인트
setTimeout() 과 setInterval() 은 비동기적으로 작동하는 함수이다.
자바스크립트는 동기적으로, 즉, 스크립트를 순차적으로 읽으며 실행된다.
이 말은 윗라인의 실행이 끝나기 전까지는 아래라인은 실행할 엄두도 내지 못한다는 것이다.
예를 들어보자.
1
2
3
4
5
6
7
|
console.log('start working');
console.log('still working');
console.log('end working');
// "start working"
// "still working"
// "end working"
|
cs |
크롬 브라우저에서 콘솔을 열어서 위 코드를 복붙하고 엔터를 땅! 치면 우리는 예상했던대로 일을 시작하고, 일하는 중이고, 일을 끝낸다는 아주 당연한 결과를 가지고 온다.
그런데 갑자기 팀장님이 일을 계속 무자비하게 막 준다. 그러면 당연히 퇴근이 늦어질 것이다. 그래서 setTimeout()이라는 알바를 고용해서 일을 맡겨봤다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
console.log('start working');
console.log('still working');
setTimeout(function() {
console.log('extra working');
}, 1000);
console.log('end working');
// "start working"
// "still working"
// ??
// "end working"
|
cs |
나는 퇴근을 할 수 있을까?
포인트에서 언급했듯이 이 알바생은 훌륭하게도 비동기적으로 일을 한다. 내가 알바생에게 일을 맡기면 자기가 일하기 편한대로 가서 지시한 시간까지 일을 처리한다. 나는 내 일이 끝나면 퇴근을 하면되고 알바생은 일을 마치고 퇴근을 한다.
결과는!?
1
2
3
4
5
6
7
|
// "start working"
// "still working"
// "end working"
...1000 ms later
// "extra working"
|
cs |
하하하 퇴근을 해도 알바생 덕분에 비동기적으로 일을 마무리 할 수 있었다.
다시말해, setTimeout() 은 실행 명령만 내려주고 해당 함수를 아무도 모르는(만든사람은 앎) 공간에서 주어진 시간이 지날때까지 함수를 실행시키고 결과를 돌려줄 준비를한다. 그 동안 다음 라인들이 실행이 되고 마치면 기다렸던 결과를 돌려준다.
setInterval(func, millisec)
setTimeout() 과 동일한 방식으로 작동하는 함수로 다른점은 setTimeout() 은 한번만 실행하지만 이 친구는 주어진 시간만큼을 간격으로 반복적으로 func 함수를 실행 시켜준다.
1
2
3
|
setInterval(function() {
console.log('hello');
}, 1000)
|
cs |
실행 횟수의 차이가 있다는 것만 알아두면 될것 같다.
한가지 팁!
setInterval() 을 멈추고 싶다면 clearInterval() 을 사용하면 멈춰줄 수 있다.
setInterval() 을 멈추는 방법
1
2
3
4
5
|
var intervalFunction = setInterval(function() {
console.log('hello');
}, 1000);
clearInterval(intervalFunction);
|
cs |
자, 그럼 Interval Clear 하러 가볼까?
'Programming > JavaScript tips' 카테고리의 다른 글
Node.js 서버사이드 (0) | 2019.08.11 |
---|---|
React.js_리액트 (0) | 2019.08.05 |
Web Architecture (0) | 2019.08.02 |
[Algorithms]N-queens (Chess Puzzle) (0) | 2019.08.02 |
Prototype? __proto__? constructor? (0) | 2019.07.29 |