프라미스 만들기
프라미스는 쉽게 만들 수 있습니다. resolve(성공)과 reject(실패) 콜백이 있는 함수로 새 Promise 인스턴스를 만들기만 하면 됩니다. countdown 함수를 고쳐 봅시다. 매개변수를 받게 만들어서 5초 카운트다운에 매이지 않게 하고, 카운트다운이 끝나면 프라미스를 반환하게 하겠습니다.
function countdown(seconds) {
return new Promise(function(resolve, reject) {
for(let i=seconds; i>=0; i--) {
setTimeout(() => {
if(i>0) console.log(i + '...');
else resolve(console.log('GO!'));
}, (seconds - i)*1000);
}
});
}
/*
countdown(5);
5...
4...
3...
2...
1...
GO!
*/
이대로라면 별로 좋은 함수는 아닙니다. 너무 장황환 데다가, 콘솔을 아예 쓰지 않기를 원할 수도 있습니다. 웹 페이지에서 카운트다운이 끝나면 페이지 요소를 업데이트하는 목적에 쓰기도 별로 알맞지 않아 보입니다. 하지만 이제 시작일 뿐이고, 프라미스를 어떻게 만드는지는 잘 드러나 있습니다. resolve와 reject는 함수입니다. resolve를 여러 번 호출하면 프라미스의 프라미스 같은 걸 만들 수 있지 않을까 하는 생각이 들 수도 있겠지만, resolve나 reject를 여러 번 호출하든, 섞어서 호출하든 결과는 같습니다. 첫 번째로 호출한 것만 의미가 있습니다. 프라미스는 성공 또는 실패를 나타낼 뿐입니다(현재 이 함수에는 실패 부분이 없습니다만).