더북(TheBook)

그럼 Promise 응용 코드를 올바르게 작성하려면 단위 테스트를 어떻게 고쳐야 할까? 핵심은 Promise에 ‘이를 때까지’ 코드 결과를 체크하지 않는 것이다. 그러려면 다음 두 가지를 고민해야 한다.

첫째, checkInService.checkInthen을 호출하여 수신한 값을 반환하게 한다. 이것이 바로 Promise다! then에는 두 가지 콜백이 있다. 귀결/성공 콜백으로 끝나면 귀결 Promise를, 버림/실패 콜백에 이르면 버림 Promise를 반환할 것이다. checkIn 함수가 직접 Promise를 만들어 반환하게 해도 되지만(방법은 잠시 후에 설명한다), 조금 더 생각해보니 예제 6-3에서 봤던 지름길이 있다. 콜백이 각자 Promise를 반환하도록 하면 이 Promise는 언젠가 then이 반환한 Promise의 귀결값이 될 것이다. 일반적으로 then 콜백이 유사 Promise(Promise-like) 객체(then 함수가 있는 객체)를 반환하면 해당 객체는 then의 귀결값으로 마무리된다. 그렇지 않으면 then이 귀결 Promise 안에서 일단 콜백 반환값을 감싼 다음 반환한다.

 

예제 6-3 then 결과를 반환

 

소스 파일 6장\Promises\checkInService.js

var Conference = Conference | | {};
 
Conference.checkInService = function(checkInRecorder) {
‘use strict’;
 
// 주입한 checkInRecorder의 참조값을 보관한다.
var recorder = checkInRecorder;
 
return {
  checkIn: function(attendee) {
    attendee.checkIn();
    return recorder.recordCheckIn(attendee).then(
      function onRecordCheckInSucceeded(checkInNumber) {
        attendee.setCheckInNumber(checkInNumber);
        return Promise.resolve(checkInNumber);
       },
      function onRecordCheckInFailed(reason) {
        attendee.undoCheckIn();
        return Promise.reject(reason);
      });
  }
};
};

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