콜백 헬로 인해서 찾기 힘든 에러나 버그를 잡기 위해서 Promise가 도입되었다. Promise를 통한 결과 객체는 클래스처럼 인스턴스로 반환하게 되는데 오직 성공, 실패 두 가지 경우만 있다. 또한 딱 1번만 결과가 실행되며 다른 함수에게 결과를 전달할 수 있다.
function countdown(seconds) {
return new Promise(function (resolve, reject) {
for (let i = seconds; i >= 0; i--) {
setTimeout(function () {
if(i === 13) return reject(new Error('now = 13ms'));
if (i > 0) {
console.log(i + '...');
} else {
resolve(console.log('Finish!'));
}
}, (seconds - i) * 1000);
}
});
}
count(15);
기본적으로 객체를 반환하는 것처럼 작성할 수 있다. 위 코드는 인풋으로 받은 숫자(15)부터 1초간격으로 줄이면서 i를 출력하며 도중에 13일 땐(reject) new Error를 반환한다. 그리고 i = 0이 되면(resolve) 'Finish'를 출력한다.
하지만 성공/실패 중 하나라도 결정되면 동작을 멈춰야 하는데 그렇지 않기 때문에 이 점은 이벤트로 보완이 가능하다.