AngularJS 1.7.9:如何调试“可能未处理的拒绝:{}”?

时间:2020-02-22 09:37:09

标签: angularjs debugging error-handling angular-ui-router angular-promise

我知道一些类似的问题,例如Angularjs 1.7.9 - Possibly unhandled rejection及其中提到的重复项。

但是,我的代码没有使用诺言(我知道;当然没有$promise$http)。

我只是为一个朋友制作了一个简单的ui-router演示。它只是两个视图,每个视图都有一个切换到另一个视图的按钮。它在AngulrJs 1.5上可以正常工作,并在1.7中因上述错误而中断。

虽然很简单,但是要发布的代码太多了。以防万一,而不是在我的代码中发现错误,我希望得到一个规范的答案,以帮助以后阅读此问题的其他人:如何着手处理此错误消息?

错误:转换失败(由“可能未处理的拒绝:{}”引起)

at r [as $get] (http://localhost/common/js/third_party/ui-router_zero_pint_2_point_11/angular-ui-router.min.js:7:11365)  
at Object.invoke (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:45:62)  
at http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:46:365  
at d (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:43:495)  
at e (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:44:235)  
at Object.invoke (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:44:320)  
at http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:47:18  
at r (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:8:76)  
at fb (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:46:499)  
at c (http://localhost/common/js/third_party/angular-1_point_7_point_9/angular.min.js:22:57)  

2 个答案:

答案 0 :(得分:1)

以下是调试ui-router的一种方法:

从控制台注入$state服务,键入以下内容:

var test = angular.element(document.body).injector().get('$state');

然后模拟并执行导致问题的过渡:

test.go('root.details') // use the state url here

之后,过渡的详细信息将在控制台中打印。在$$state对象中,您可能会找到有关转换失败和失败原因的更多详细信息: enter image description here

答案 1 :(得分:1)

最新版本的UI-router(1.0.25)解决了该问题。随时发布答案。

如果使用angular.js代替angular.min.js,而使用angular-ui-router.js代替angular-ui-router.min.js,则将获得更多的堆栈跟踪信息。 Angular-UI-Router在其过渡模块中使用promise。好像您升级了AngularJS的版本而没有升级Angular-UI-Router的版本。将路由器从V0.2.11升级到V0.4.3。看来您的问题是由不正确的Angular-UI-Router代码引起的。如果他们在V0.4.3之前不能解决问题,则可以修补库或随消息一起使用。

调试"possibly unhandled rejection"

堆栈跟踪将显示文件和错误产生的行号。检查代码并解决问题。如果错误是由第三方库引起的,请尝试升级到最新版本或与第三方库供应商联系。

作为最后的选择,禁用"possibly unhandled rejection"消息:

app.config(functon ($qProvider) {
    $qProvider.errorOnUnhandledRejections(false);
}); 

不建议这样做,因为它会使其他问题默默地失败。

如果不关心某个特定的诺言失败,请添加一个.catch处理程序:

$http(config).then(function(response) {
    //...
}).catch(function(response) {
   //I don't care about errors
   if (debug) console.log(response);
   //Re-throw error response
   throw response;
})

升级AngularJS

升级AngularJS时,最好同时升级所有AngularJS模块。那就是从angular.js@1.4迁移到angular.js@1.5时,同时升级到angular-animate@1.5angular-resource@1.5angular-route.js@1.5等。尝试时遇到了不愉快的问题混合和匹配AngularJS模块的版本。

迁移时,建议一次升级一个次要版本。例如,先从V1.4升级到V1.5,修复问题,然后再升级到V1.6。

当前版本为1.7.9 pollution-eradication (2019-11-19)。我建议使用最新版本,因为AngularJS团队致力于仅在V1.2.x和最新版本中修复安全错误。 有关更多信息,请参见

升级Angular-UI-路由器

用于AngularJS的UI-Router有两个主要版本

版本0.4.3 UI-Router-Legacy

版本1.0.25 UI-Router for AngularJS

我建议先迁移到最新版本的UI-Router-Legacy,然后再迁移到最新版本的UI-Router for AngularJS。两者之间发生了重大的突破性变化,最好逐步解决。

有关更多信息,请参见