비동기
- 지금과 나중
- setTimeout(나중에 실행할것, 언제);
비동기가 필요한 이유
#. 비유적 이해
- 눈 코뜰새없이 바쁜 식당
- 주문하는데 뜸을 들이는 손님
- 손님이 주문을 완료하기 까지 기다릴 시간이 없다
- 손님의 주문을 기다리는 동안 다른 일을 한다
#. 현실적 상황
- I/O -> 어플리케이션은 수많은 I/O 에 둘러쌓여 있다.
- file rw, network ...
- I/O 는 대기시간을 필요로 한다
- 어플리케이션이 대기시간 동안 아무것도 못하게 할수는 없다
지금과 나중 -> '나중' 을 처리하는 방법
#. 콜백
- 작업이 완료되면 실행할 코드를 넘겨주는 것
- '끝나면 이렇게 해주세요'
- 엔진(코드 처리 주체)은 그동안 다른 일을 할 수 있다
- setTimeout(function 이렇게 해주세요, 1000);
#. 이벤트 루프
- 주체: 엔진과 호스팅 환경
- 작업이 완료(이벤트)되면 호스팅 환경에서 대기열(큐)에 콜백을 등록한다
- 엔진은 대기열을 주기적으로 확인한다
- 엔진이 대기열에 쌓인 작업을 처리한다
#. '이렇게 해주세요'의 문제점
- 콜백을 몇 번 호출하는지, 어떻게 호출할지 알 수 없다
- 콜백을 호출하는 곳의 코드에 의존하게 된다
#. 진동벨을 주세요
- 작업의 완료와 실패를 알려주는 진동벨을 도입
- 완료시에 할 일을 등록
- 실패시에 할 일을 등록
- 진동벨로 소통하기 때문에, 호출하는 코드에 의존하지 않는다
Promise - 진동벨
#. 진동벨 만들기
- 작업 성공, 작업 실패 조건을 정의
- 성공 조건, 실패 조건 발생시 진동벨 상태를 변화시키기
- Promise(상태변화(성공, 실패))
#. 진동벨 사용하기
- 성공시 할 일 then()
- 실패시 할 일 catch()
- 성공이든 실패든 마지막에 할 일 finally()
#. 여러개의 진동벨 사용하기
- 모두 다 울리면 할 일 all()
- 하나라도 울리면 할 일 race()
참고 자료
- Kyle Simphson. (2015). You don't know JS: 비동기와 성능.