Promise

그린그레이프·2020년 6월 9일
0

비동기

  • 지금나중
  • 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: 비동기와 성능.
profile
제대로 걷는 한걸음이 곧 백걸음이다

0개의 댓글