자바 스크립트 약속을 디버그하는 방법은 무엇입니까?
약속을 기반으로하는 비동기 코드를 디버깅하는 방법을 이해하려고합니다. 약속이란 ECMAScript 6 기반 약속을 의미하고 디버깅이란 내장 크롬 또는 파이어 폭스 디버거를 사용하는 것을 의미합니다.
내가 문제가되는 것은 오류가 발생하면 어떻게 '거부'하더라도 스택 추적을 얻을 수 없다는 것입니다.
나는 이것을 시도했다 :
console.log(new Error('Error occured'));
throw new Error('Throwing an Error');
return new Error('Error returned by the onRejected function');
reject(new Error('Pass Error to the reject function'));
그러나 이들 중 어느 것도 코드 또는 스택 추적에서 실제 오류를 반환하지 않습니다.
그래서 내 질문은-자바 스크립트 약속을 올바르게 디버깅하는 방법입니다.
이것은 토론하기에 좋은 주제입니다. 슬픈 소식은 이것이 실제로 네이티브 약속으로는 상당히 어렵다는 것입니다.
Chrome에서 원시 ES6 약속을 디버깅하는 것은 끔찍합니다. 이는 오류를 자동으로 억제하고 catch를 생략 할 때마다 promise가 실패했다는 표시를 제공하지 않기 때문입니다. 업데이트 : Chrome은 이제 처리되지 않은 거부를 기록합니다 (방법은이 링크 참조).
Promise.resolve("foo").then(function(){
throw new Error("You will never see this");// silent failure
});
Firefox에서는 처리되지 않은 거부 감지를 수행하기 때문에 상황이 조금 더 낫습니다. 그러나 여전히 결함이 있으며 약속을 어디에 할당하면 작동하지 않습니다.
그래서 무엇을 할 수 있습니까?
Bluebird 포함 -ES6 약속의 상위 집합이며 내부에서 바로 바꿀 수 있으며 더 풍부한 API가 있으며 더 빠르고 놀라운 스택 추적이 있습니다. 디버깅을 염두에두고 구축되었으며 훌륭한 오류 처리 기능을 포함합니다.
Bluebird를 포함하면 다음으로 전화하십시오.
Promise.longStackTraces();
속도가 약간 느려지고 (여전히 매우 빠름) 놀라운 오류 메시지가 표시됩니다. 예를 들면 :
Promise.resolve().then(function outer() {
return Promise.resolve().then(function inner() {
return Promise.resolve().then(function evenMoreInner() {
a.b.c.d()
});
});
});
네이티브 프라 미스에서-이것은 조용히 실패하고 디버그하기 매우 어려울 것입니다. 블루 버드 프라 미스를 사용하면 기본적으로 콘솔에 큰 빨간색 오류가 표시되어 기본적으로 다음을 제공합니다.
ReferenceError: a is not defined
at evenMoreInner (<anonymous>:6:13)
From previous event:
at inner (<anonymous>:5:24)
From previous event:
at outer (<anonymous>:4:20)
From previous event:
at <anonymous>:3:9
at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
at Object.InjectedScript.evaluate (<anonymous>:459:21)
디버깅이 완료되면이를 교체하고 네이티브 약속으로 돌아갈 수 있습니다. 개인적으로 나는 프로덕션에 오류가 있다는 것을 아는 것을 중요하게 생각하므로 권장하지 않지만 확실히 할 수 있습니다.
* 이것은 귀하의 질문에 직접 답변하지는 않지만 그럼에도 불구하고 도움이 될 수 있습니다.
Chrome devtools에는 최근 Promises와 같은 비동기 코드를 디버깅하는 데 유용한 새로운 기능이 있습니다.
http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/
기본적으로 소스 탭에서 "비동기"확인란을 활성화하면 Chrome이 마치 동기 코드 인 것처럼 호출 스택을 재구성합니다.
이 답변은 Benjamin Gruenbaum의 답변에 추가되었습니다. promise 체인에서 catch 문을 사용하면 error.stack으로 스택 추적을 얻을 수 있습니다 .
Promise.longStackTraces();
function outer() {
return Promise.resolve();
}
function inner() {
return Promise.resolve();
}
function evenMoreInner() {
a.b.c.d()
}
Promise.resolve()
.then(outer)
.then(inner)
.then(evenMoreInner())
.catch(function (err) {
console.log(err.message);
console.log(err.stack);
});
에러 메시지:
ReferenceError: a is not defined
at evenMoreInner (test/test_promise.js:58:17) <<<< HERE's the error!
at Context.<anonymous> (test/test_promise.js:64:23)
Chrome에서 디버그 도구로 작업하는 것 같습니다. 자세한 내용은이 스레드를 참조하십시오.
https://code.google.com/p/v8/issues/detail?id=3093
이것이 이미 개발 버전인지 베타 버전인지 확인하지 않았지만 곧 출시되기를 바랍니다. 그런 다음 2015 년 1 월 정도의 일반 버전에 포함될 수 있습니다 (개인적인 추측 일 뿐이며 Google에서 일하지도 않기 때문에 절대적으로 약속이 없습니다).
약속 디버깅하는 가장 좋은 방법은 듣고있다 unhandledRejection
당신의 이벤트 process
.
예를 들어, 다음은이를 설정하고 스택 추적을 덤프하는 방법입니다.
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
// Stack Trace
console.log(reason.stack);
});
Promise 객체의 .then () 함수에 console.log () 문을 추가 할 수 있습니다. 필요한 경우 .catch ()에 추가 할 수도 있습니다.
genericDbCaller(dbName, collectionName, dbFunctionName, params) {
return new Promise((resolve, reject) => {
DatabaseContext.instance.getDbConn(dbName)
.then((dbConn) => {
dbConn.get(collectionName)[dbFunctionName].apply(null, params)
.then(
(docs) =>{
----->>> console.log(docs);
resolve(docs);
})
.catch((e)=>{
참고 URL : https://stackoverflow.com/questions/25827234/how-to-debug-javascript-promises
'Program Tip' 카테고리의 다른 글
D3.js가 데이터를 노드에 바인딩하는 방법 이해 (0) | 2020.11.05 |
---|---|
곱셈이 부동 나누기보다 빠릅니까? (0) | 2020.11.05 |
`printf`에`float`에 대한 지정자가 정의되지 않은 이유는 무엇입니까? (0) | 2020.11.05 |
Facebook Oauth 로그 아웃 (0) | 2020.11.05 |
! = 연산자가 OpenMP에서 허용되지 않는 이유는 무엇입니까? (0) | 2020.11.05 |