在Angular 1.6中可能无法处理的拒绝
在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); }; })
没有任何帮助。在错误处理器中,我已经收到了“包装”错误。
在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) {});
有用的链接:
在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版本来解决这个问题。