Angular 1.6에서 처리되지 않은 거부일 수 있음
Angular와 코드가 있어요JS:
service.doSomething()
.then(function(result) {
//do something with the result
});
AngularJS 1.5.에 때 AngularJS에서 에러가 발생한 경우.then()
다음과 같이 합니다.
service.doSomething()
.then(function(result) {
var x = null;
var y = x.y;
//do something with the result
});
명확한 오류 메시지가 나타납니다.
TypeError: null의 속성 'y'를 읽을 수 없습니다.
그러나 동일한 코드를 사용하는 버전 1.6에서는 다른 오류가 발생합니다.
처리되지 않은 거부일 수 있습니다. {}이(가) 정의되지 않았습니다.
이것이 이 변경과 관련이 있다는 것을 알고 있으며, 단일 솔루션은 추가함으로써 매우 간단합니다..catch()
삭제:
service.doSomething()
.then(function(result) {
var x = null;
var y = x.y;
//do something with the result
})
.catch(console.error);
이제 나는 내가 원하는 것을 다시 얻었다.
TypeError: null의 속성 'y'를 읽을 수 없습니다.
, 자세한 오류)를하는 방법..catch()
든든곳 을을?
다음을 추가하여 권장 솔루션을 테스트하여 이 기능을 비활성화했습니다.
$qProvider.errorOnUnhandledRejections(false);
하지만 상황이 더 나빠요. 콘솔에 아무것도 없어요!에러는 어디선가 삼켜져 전혀 로그에 기록되지 않는다.AngularJS 1.6의 문제인지, 내 구성에 문제가 있는지 잘 모르겠습니다.
버전 1.5.9에서 로깅 동작을 "복원"하는 방법이 있습니까?
편집:
사용자 지정 오류 처리기 추가:
.factory('$exceptionHandler', function($log) {
return function(exception, cause) {
$log.warn(exception, cause);
};
})
전혀 도움이 되지 않습니다.에러 핸들러에서는, 이미 「wraped」에러가 표시됩니다.
이 문제는 fix($q): 처리되지 않은 약속 거부에 트레이스백 추가 -- 316f60f를 커밋하여 수정이 v1.6.1 릴리스에 포함되어 있습니다.
번째 은 단순히 이입니다.이러한 거부 오류를 숨기려면 을 설정해야 합니다.errorOnUnhandledRejections
권장하는 Cengkuru Michael의 $qProvider 구성:
app.config(['$qProvider', function ($qProvider) {
$qProvider.errorOnUnhandledRejections(false);
}]);
그러나 이것은 로깅만 끕니다.오류 자체는 그대로 남습니다.
이 경우 더 나은 해결책은 다음과 같은 방법으로 거절을 처리하는 것입니다..catch()
★★★★
service.doSomething()
.then(function (response) {})
.catch(function (err) {});
유용한 링크:
버전 1.6.1에서도 angular-ui-router를 0.3.2로 업그레이드하여 동일한 문제를 해결했습니다.
이 정보를 통해 (내 경우) 약속을 만들고 오류 핸들러를 추가하지 않은 항목을 추적할 수 있었습니다.나는 그것이 이슈 #2889 "Absible unhandled reject with Angular 1.5.9"의 토론에 묻혀 있다는 것을 발견했다.
$q
에러가 발생했을 때 취득할 수 있도록, 약속 작성 시에 스택을 캐시합니다.
이렇게 하려면 이 코드를 삽입하여 장식합니다.$q
각진 앱의 상단 근처에 있습니다.
// Decorate the $q service when app starts
app.decorator('$q', ["$delegate", function($delegate) {
// Create a new promise object
var promise = $delegate.when();
// Access the `Promise` prototype (nonstandard, but works in Chrome)
var proto = promise.__proto__;
// Define a setter for `$$state` that creates a stacktrace
// (string) and assigns it as a property of the internal `$$state` object.
Object.defineProperty(proto, '$$state', {
enumerable: true,
set: function(val) {
val.stack = new Error().stack;
this._$$state = val;
},
get: function() {
return this._$$state;
}
});
return $delegate;
}]);
그런 다음 각도 코드를 검색하여 "처리되지 않은 거부" 메시지를 찾고 해당 줄에 중단점을 둡니다.중단점에 도달하면 다음 값을 출력합니다.toCheck.stack
콘솔에는 다음과 같은 내용이 표시됩니다.
>> toCheck.stack
"set@http://localhost:8000/js/dual-site.js:18:19
Promise@http://localhost:8000/js/angular.js:17008:22
then@http://localhost:8000/js/angular.js:17016:20
catch@http://localhost:8000/js/angular.js:17026:14
SyncStrategy.prototype.send@http://localhost:8000/js/angular-state-machine.js:436:24
StateMachine/this.send@http://localhost:8000/js/angular-state-machine.js:235:16
위반 코드는 각도의 캐치/그 후 함수를 호출하는 프레임입니다.
또 다른 케이스가 있습니다.finally()
handler to commits: 에러가 생성됩니다.http://plnkr.co/edit/eT834BkIEooAMvrVcLDe
왜냐면finally()
새로운 약속을 만들고 해결사를 호출합니다.(거절된 경우 두 번째 약속 거부)
PLNKR에 수정을 넣었지만 별로 좋아 보이지 않는다.
거부된 약속이 angular-ui-router(ui-sref)에서 angular ver 1.6.1을 사용하여 처리되지 않은 경우 처리되지 않은 동일한 거부 오류가 발생하며 이 기능은 기본적으로 활성화되어 있습니다.
회피책(권장하지 않음)이 필요한 경우 다음과 같이 처리되지 않은 약속 거부를 글로벌하게 무음화할 수 있습니다.
app.config(['$qProvider', function ($qProvider) { $qProvider.errorOnUnhandledRejections(false); }]);
캐치 블록에 다음과 같은 기본값을 추가하여 이 오류를 해결했습니다.
service.doSomething()
.then(function(response) {
var x = null;
var y = x.y;
}).catch(function(error) {
var y = 0;
});
(나는 숙련된 각도 현상자가 아니라는 점을 감안하여)
httpError 버전 1.6.1에서도 문제가 발생함가로채기, 한 유스케이스에 대해 내 API가 404를 반환하면 다른 데이터로 다른 요청을 시도해야 합니다.그래서 이 경우에는 요청을 거부하고 처리되지 않은 거부 오류를 각도 있게 던질 뿐입니다.
1.5.9 를 인스톨 하면, 에러가 없어집니다.
errorOnUnhandledRejections(false)는 해결 방법이 아니었습니다.
예외 핸들러를 정의할 필요가 있습니다.하지만...타임아웃 함수로 랩: 원래 예외/스택 트레이스를 강제로 슬로우합니다.
원래 의도한 대로 웹 콘솔에 오류로 표시되도록 하려면 다음 절차를 수행합니다.
ng.factory('$exceptionHandler', function($log) {
return function(exception, cause) {
// do some some stuff...
setTimeout(function(){
// throw the original exception (with correct line #'s etc)
throw exception;
})
};
});
타임아웃 트릭을 다음에 나타냅니다.Promise.catch 핸들러에 넣을 수 없는 이유는 무엇입니까?
언급URL : https://stackoverflow.com/questions/41281515/possibly-unhandled-rejection-in-angular-1-6
'programing' 카테고리의 다른 글
개체 배열에 대한 TypeScript 열거 (0) | 2023.03.14 |
---|---|
네트워크 프록시 뒤의 스프링 부트 (0) | 2023.03.14 |
React 및 TypeScript - Axios 응답 유형 (0) | 2023.03.08 |
JSON을 C# 다이내믹 객체로 역직렬화하시겠습니까? (0) | 2023.03.08 |
최대 길이가 작동하지 않음 React Js (0) | 2023.03.08 |