在Angular 1.6中可能无法处理的拒绝

15 浏览
0 Comments

在Angular 1.6中可能无法处理的拒绝

我有一个使用AngularJS的代码:

service.doSomething()
  .then(function(result) {
      //对结果进行处理
  });

在AngularJS 1.5.9中,当我在.then()部分出现错误时,比如:

service.doSomething()
  .then(function(result) {
      var x = null;
      var y = x.y;
      //对结果进行处理
  });

我会得到清晰的错误信息:

TypeError: Cannot read property 'y' of null

但是在相同代码的1.6版本中,我得到了一个不同的错误:

Possibly unhandled rejection: {} undefined

我知道这与这个变更有关,而且唯一的解决方法是在添加.catch()块:

service.doSomething()
  .then(function(result) {
      var x = null;
      var y = x.y;
      //对结果进行处理
  })
  .catch(console.error);

现在我又得到了我想要的结果:

TypeError: Cannot read property 'y' of null

但是如何在整个应用程序中获得相同的结果(更详细的错误)而不是在每个地方都添加.catch()块呢?

我测试了建议的解决方法,通过添加:

$qProvider.errorOnUnhandledRejections(false);

但是这样情况变得更糟 - 控制台中什么都没有!错误被吞噬了,根本没有被记录。我不确定这是AngularJS 1.6的问题还是我的配置问题。

你有任何想法如何“恢复”1.5.9版本的日志记录行为吗?

编辑:

添加自定义错误处理器:

.factory('$exceptionHandler', function($log) {
  return function(exception, cause) {
    $log.warn(exception, cause);
  };
})

没有任何帮助。在错误处理器中,我已经收到了“包装”错误。

0
0 Comments

在Angular 1.6中可能会出现未处理的拒绝错误(Possibly unhandled rejection in Angular 1.6)的问题。出现这个问题的原因是在代码中没有正确处理拒绝(rejection)。

解决这个问题的第一个选项是通过在$qProvider的配置中设置errorOnUnhandledRejections来隐藏特定的拒绝错误,如Cengkuru Michael建议的那样:

app.config(['$qProvider', function ($qProvider) {
    $qProvider.errorOnUnhandledRejections(false);
}]);

但是这只会关闭日志记录,错误本身仍然存在。

在这种情况下更好的解决方法是使用.catch()方法来处理拒绝:

service.doSomething()
    .then(function (response) {})
    .catch(function (err) {});

有用的链接:

0
0 Comments

在Angular 1.6中出现(Possibly unhandled rejection in Angular 1.6)的问题的原因是由于未处理的promise rejection。在1.6.1版本中,开发者仍然会遇到这个错误,即使在代码中使用了ngResource和$promise。为了解决这个问题,需要使用$qProvider.errorOnUnhandledRejections(false)来禁用未处理的rejection错误。然而,这并不是一个好主意,因为它只是隐藏了错误而并没有提供更清晰的错误信息。

在讨论中,某些情况下了一个解决方案,即在回调函数中返回一个被拒绝的promise,以便客户端知道服务出错了。例如:$http(config).then((response) => {...}, (error) => { return $q.reject(error); });

另外,如果没有处理一个rejection,就会出现错误。这是它的工作原理。需要注意的是,每个then()调用都会返回一个新的promise。

另一个开发者表示,在从1.5版本升级到1.7版本时出现了这个错误,而且在代码中并没有使用显式的promise。在1.5版本中,一切都正常运行,但在1.7版本中,启动时会抛出这个错误3次。

这个问题在Angular的GitHub讨论中得到了解决。在修复中,添加了一个追踪信息,以便更好地处理未处理的promise rejection。修复已经包含在1.6.1版本中。

要解决Angular 1.6中出现的(Possibly unhandled rejection in Angular 1.6)问题,可以使用$qProvider.errorOnUnhandledRejections(false)来禁用未处理的rejection错误,并在回调函数中返回一个被拒绝的promise以提供更清晰的错误信息。此外,也可以升级到1.6.1版本来解决这个问题。

0
0 Comments

在Angular 1.6中可能会出现未处理的拒绝(rejection)问题。我通过将angular-ui-router升级到0.3.2版本来解决了相同的问题。0.4版本也修复了一些bug。

0