커피주문으로 알아보는 동기적인 로직
- 손님 1이 아메리카노주문한다
- 접수를 받은 직원이 아메리카노를 만든다
- 직원이 손님 1에게 아메리카노를 준다
- 손님 2가 카페라떼를 주문한다
- 접수를 받은 직원이 카페라떼를 만든다.
- 직원이 손님 2에게 카페라뗴를 준다.
손님2는 손님1의 주문이 끝나고 커피를 받을 때까지
기다려야함.
요청에 대한 결과가 동시에 일어난다.
-> 요청하고 커피를 받게되니까.
비동기적 로직
- 손님 1이 아메리카노를 주문한다
- 접수를 받은 직원이 아메리카노 만든다.
- 아메라카노 완성되면(이벤트) 직원이 손님 1을 부른다 (call back)
- 아메리카노를 손님 1에게 전달한다.
- 손님 2가 카페라떼를 주문한다
- 접수를 받은 직원이 카페라떼를 만든다.
- 카페라떼가 완성되면(이벤트) 직원이 손님 2를 부른다. (call back)
- 카페라떼를 손님 2에게 전달한다,
요청에 대한 결과가 동시에 일어나지 않는다.
고로 비동기의 주요사례로는
1. DOM Element의 이벤트 핸들러
- 마우스, 키보드 입력(click, keydown 등)
- 페이지 로딩 (DOMContentLoaded 등)
2. 타이머
- 타이머 API (setTimeoute등)
- 애니메이션 API (requestAnimationFrame)
3. 서버에 자원 요청 및 응답
- fetch API
- AJAX (XHR)
비동기는 항상 이벤트 핸들러 (버튼 클릭)과 같다고 보면 된다.
타이머 API
setTimeout(callback, millisecond)
-> 일정 시간 후에 함수를 실행
- arguments: 실행할 callback 함수, callback 함수 실행 전 기다려야 할 시간 (밀리초)
- return value: 임의의 타이머 ID
setInterval(callback, millisecond)
-> 일정 시간의 간격을 가지고 함수를 반복적으로 실행
- arguments: 실행할 callback 함수, 반복적으로 함수를 실행시키기 위한 시간 간격 (밀리초)
- return value: 임의의 타이머 ID
clearInterval(timerId)
->반복 실행중인 타이머를 종료
- arguments: 타이머 ID
- return value: 없음
var timer = setInterval(function() {
console.log('1초마다 실행');
}, 1000);
clearInterval(timer);
- setTimeout에 대응하는 clearTimeout도 있음