JavaScript에서 이행된 Promise 생성하기
때로는 이미 완료된 Promise를 생성해야 할 때가 있습니다. 이를 위한 두 가지 메서드가 있습니다: Promise.resolve
메서드는 성공적으로 이행된 Promise를 생성하고, Promise.reject
메서드는 거부된 Promise를 생성합니다. 이 메서드들의 매개변수는 각각 Promise의 결과 또는 오류가 될 값을 받습니다.
왜 이미 이행된 Promise가 필요할까요? 예제를 통해 살펴봅시다. 어떤 숫자를 매개변수로 받아 비동기적으로 처리하고 결과를 가진 Promise를 반환하는 함수가 있다고 가정해 봅시다:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
우리는 이 함수를 다음과 같이 사용할 것입니다:
func(5).then(function(res) {
console.log(res); // 25를 출력합니다
});
이제 우리는 양수일 때만 비동기 연산을 수행하기로 결정했다고 가정해 봅시다. 그렇지 않으면 함수의 결과는 0이어야 합니다:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // 제로 결과
}
}
그러나 이제 함수는 Promise 또는 숫자를 반환하게 됩니다. 이 때문에 함수 결과에 then
메서드를 적용할 수 없게 되었습니다. 함수가 숫자를 반환하는 경우 오류가 발생하기 때문입니다:
func(0).then(function(res) { // 오류: 숫자 0에 then 메서드를 적용합니다
});
이 문제는 Promise.resolve를 사용하여 해결할 수 있습니다:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // 숫자가 아닌 Promise를 반환합니다
}
}
이제 전달된 숫자가 0일 때는 0을 반환하고, 음수일 때는 예외를 발생시키기로 결정했다고 가정해 봅시다. 이 경우 Promise.reject
메서드가 도움이 될 것입니다:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // 거부된 Promise를 반환합니다
}
}