programing

Angular 1.6에서 처리되지 않은 거부일 수 있음

nicescript 2023. 3. 14. 23:21
반응형

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

반응형