그럼 Promise 응용 코드를 올바르게 작성하려면 단위 테스트를 어떻게 고쳐야 할까? 핵심은 Promise에 ‘이를 때까지’ 코드 결과를 체크하지 않는 것이다. 그러려면 다음 두 가지를 고민해야 한다.
첫째, checkInService.checkIn이 then을 호출하여 수신한 값을 반환하게 한다. 이것이 바로 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); }); } }; };