프로그래밍 언어/HTML,CSS,JS

자바스크립트 - reject vs. throw

Rateye 2021. 9. 7. 10:46
728x90
반응형
질문 : 자바 스크립트 약속-거부 대 던지기

이 주제에 대한 여러 기사를 읽었지만 Promise.reject 와 오류를 던지는 것 사이에 차이점이 있는지 아직 명확하지 않습니다. 예를 들면

Promise.reject 사용

return asyncIsPermitted()
    .then(function(result) {
        if (result === true) {
            return true;
        }
        else {
            return Promise.reject(new PermissionDenied());
        }
    });

던지기 사용

return asyncIsPermitted()
    .then(function(result) {
        if (result === true) {
            return true;
        }
        else {
            throw new PermissionDenied();
        }
    });

내 선호는 throw 가 더 짧기 때문에 사용하는 것이지만, 다른 것보다 하나의 이점이 있는지 궁금합니다.

답변

하나를 사용하는 것의 이점은 없지만 throw 가 작동하지 않는 특별한 경우가 있습니다. 그러나 이러한 경우는 수정할 수 있습니다.

promise 콜백 내부에있을 때 언제든지 throw 를 사용할 수 있습니다. 그러나 다른 비동기 콜백에있는 경우에는 reject 를 사용해야합니다.

예를 들어, 이것은 catch를 트리거하지 않습니다.

new Promise(function() {
  setTimeout(function() {
    throw 'or nah';
    // return Promise.reject('or nah'); also won't work
  }, 1000);
}).catch(function(e) {
  console.log(e); // doesn't happen
});

대신 해결되지 않은 약속과 잡히지 않은 예외가 남습니다. reject 를 사용하려는 경우입니다. 그러나 두 가지 방법으로이 문제를 해결할 수 있습니다.

1.제한 시간 내에 원래 Promise의 거부 함수를 사용합니다.
new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject('or nah');
  }, 1000);
}).catch(function(e) {
  console.log(e); // works!
});
2.시간 초과를 약속합니다.
function timeout(duration) { // Thanks joews
  return new Promise(function(resolve) {
    setTimeout(resolve, duration);
  });
}

timeout(1000).then(function() {
  throw 'worky!';
  // return Promise.reject('worky'); also works
}).catch(function(e) {
  console.log(e); // 'worky!'
});
출처 : https://stackoverflow.com/questions/33445415/javascript-promises-reject-vs-throw
728x90
반응형