그러나 앞서 언급했듯이 이러한 스타일을 남용하면 코드를 추측하기 어렵습니다. 따라서 지속적으로 일급 객체(first-class citizen)를 만들고 실제로 ‘연속’이 무엇을 의미하는지 구체적인 해석을 정의해 나아가야 합니다. 그래서 ‘X를 실행한 다음(then
) Y를 실행하라’의 then
이라는 개념을 소개하고자 다음 코드를 작성했습니다
이 부분이 Promise
가 도입되는 곳입니다. Promise
는 비동기와 장기 실행 연산 그리고 결과나 에러를 구독할 수 있는 미래 값을 래핑한 데이터 유형으로, 기본 작업이 완료되어 계산된 결괏값을 구독자(subscriber)가 받게 될 때 프로세스가 완료된 것으로 간주합니다. Promise
가 실행된 후에는 값을 변경할 수 없으므로 사실상 함수형 특성인 불변 타입입니다. 또 다른 Promise
구현은 Promise/A+ 프로토콜5을 기반으로 하며, 일정 수준의 에러 처리와 then()
메서드를 통한 연속을 제공하게 설계되었습니다. ajax()
가 Promise
를 반환한다고 가정할 때 앞서 다룬 예제를 처리하는 방법은 다음과 같습니다.
ajax('<host1>/items') .then(items => items.forEach(item => ajax(<host2>/data/${item.getId()}/info`) .then(dataInfo => ajax(`<host3>/data/files/${dataInfo.files}`) ) .then(processFiles); ) );