JavaScript에서 이행된 Promise 생성하기

때로는 이미 완료된 Promise를 생성해야 할 때가 있습니다. 이를 위한 두 가지 메서드가 있습니다: Promise.resolve 메서드는 성공적으로 이행된 Promise를 생성하고, Promise.reject 메서드는 거부된 Promise를 생성합니다. 이 메서드들의 매개변수는 각각 Promise의 결과 또는 오류가 될 값을 받습니다.

왜 이미 이행된 Promise가 필요할까요? 예제를 통해 살펴봅시다. 어떤 숫자를 매개변수로 받아 비동기적으로 처리하고 결과를 가진 Promise를 반환하는 함수가 있다고 가정해 봅시다:

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

우리는 이 함수를 다음과 같이 사용할 것입니다:

javascriptfunc(5).then(function(res) {
  console.log(res); // 25를 출력합니다
});

이제 우리는 양수일 때만 비동기 연산을 수행하기로 결정했다고 가정해 봅시다. 그렇지 않으면 함수의 결과는 0이어야 합니다:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // 제로 결과
  }
}

그러나 이제 함수는 Promise 또는 숫자를 반환하게 됩니다. 이 때문에 함수 결과에 then 메서드를 적용할 수 없게 되었습니다. 함수가 숫자를 반환하는 경우 오류가 발생하기 때문입니다:

javascriptfunc(0).then(function(res) { // 오류: 숫자 0에 then 메서드를 적용합니다
  
});

이 문제는 Promise.resolve를 사용하여 해결할 수 있습니다:

javascriptfunction 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 메서드가 도움이 될 것입니다:

javascriptfunction 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를 반환합니다
  }
}