이 코드가 있습니다.
new Promise(() => {
setTimeout(() => { throw new Error('ERROR') }, 1000);
}).catch(err => {
console.log('CATCHED ', err);
});
그리고 setTimeout에서 발생하는 오류를 포착하지 않습니다. 왜?
내 의견에 대한 귀하의 의견은 사례가 다른 답변과 다르다고 제안했습니다. 이 설명을 주석에 넣을 수 없으므로 다음과 같습니다.
실제로 catch 블록은 promise가 거부 할 때까지 기다리지 않습니다 . 이 시도:
const myPromise = new Promise(() => {
console.log('inside of the promise');
setTimeout(() => { console.log('inside of the timeout function'); throw new Error('ERROR') }, 1000);
}).catch(err => {
console.log('CATCHED ', err);
});
console.log('outside of the catch block, and my promise is', myPromise);
타임 아웃 함수 내부의 메시지 이전에 catch 메시지 외부가 콘솔에 기록되는 것을 알 수 있습니다. 이 시점에서 약속이 해결되지 않았습니다 (보류 중).
setTimeout을 사용하면 함수가 JavaScript의 대기열 끝에 추가됩니다.
편집하다
약속에 대해 거부를 호출하여이 문제를 해결할 수 있습니다.
const myPromise = new Promise((resolve,reject) => {
setTimeout(() => { reject('ERROR'); }, 1000);
}).catch(err => {
console.log('CAUGHT ', err);
});
이 경우 거부 기능이 스코프 버블 (클로저)에 유지되므로 여전히 해결할 수 있기 때문에 다릅니다.
2 편집
이에 대한 의견에서 토론이있는 또 다른 질문을 찾았습니다.
이것으로 설명을 수정하겠습니다.
첫째, 약속에 연결 하는 catch 함수 와 catch 블록을 마음에 따로 두는 것이 좋습니다 . Promise는 내장 된 보이지 않는 catch 블록을 사용하여 발생한 오류를 포착하는 것으로 생각하십시오 . 이를 처리 할 때 promise의 catch 블록 은 catch 함수를 트리거하는 'reject'를 호출 합니다 .
오류 발생 => promise의 보이지 않는 (암시 적) catch 블록 => reject () => promise의 catch () 함수
그러나 setTimeout과 함께 다른 호출 스택에서 오류가 발생하면이를 잡을 수 없습니다.
throw 된 오류 (setTimeout의 다른 호출 스택에서) => 잡히지 않은 예외
예외가 다른 호출 스택에서 버블 링되기 때문에 체인이 중지됩니다.
그러나 위의 코드 스 니펫이 수행하는 작업 인 catch 함수를 트리거하여 여전히 reject를 호출 할 수 있습니다.
거부 => 약속의 catch () 함수
이벤트 체인이 더 짧아 원하는 동작 (catch 함수에서 코드 트리거)으로 바로 절단됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다