더북(TheBook)

6.1.1 프라미스 사용법

5장에서 recordCheckIn 함수에는 checkInRecorder 객체가 있었다. 하지만 단위 테스트를 할 때는 재스민 스파이가 recordCheckIn 대역이었고, 이 스파이는 오직 recordCheckIn이 호출되었는지만 감시했다. 예제 5-4 코드를 다시 보자.

expect(checkInRecorder.recordCheckIn).toHaveBeenCalledWith(attendee);

 

checkInServicecheckInRecorder를 호출하는 건 단순한 ‘저질러 놓고 잊어버리기(fire-and-forget1)’라 호출 여부만 알면 그만이다(다음 예제 5-5 코드 참고).


Conference.checkInService = function(checkInRecorder) {
// 주입한 checkInRecorder의 참조값을 보관한다.
var recorder = checkInRecorder;

return {
  checkIn: function(attendee) {
    attendee.checkIn();
    recorder.recordCheckIn(attendee);
  }
};
};

그러나 더 많은 일을 하고 싶을 때가 있다(예: 에러 처리 또는 작업 성공 시 후속 처리를 덧붙이는 작업). checkInRecorder는 보통 XMLHttpRequest로 체크인 등록 서버와 연동할 수 있게 구현한다. checkInRecorder는 요청을 보낸 후 onreadystatechange 이벤트를 귀 기울이고 있다가 결과의 성공/실패에 따라 조처를 한 뒤 자신의 호출부(checkInService)에 바통을 넘기는 식으로 흘러간다. 이렇게 틀에 박힌 작업을 계속 신경 쓰는 건 따분한 일이고 자칫 난삽한 코드로 뒤범벅 될 우려도 있다. 예제 6-1처럼 뭔가 예쁘고 우아하게 처리할 수는 없을까?

 

1 역주 파이어 앤 포겟(fire-and-forget)은 원래 군사 용어입니다. 3세대 유도 미사일이 발사 버튼을 누른 이후 사람이 더는 미사일을 유도하지 않아도 목표물에 자동으로 찾아가 명중하는 것을 가리키는 말입니다. 이 책에서도 어떤 기능을 하고 어떤 반환값을 돌려주든 상관없이 함수를 호출하는 행위를 비유적으로 표현하고 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.