Angular 1.6.0:“可能未处理的拒绝”错误

新手上路,请多包涵

在我们的 Angular 应用程序中,我们有一个解决承诺的模式,在 Angular 1.6.0 之前一直为我们提供良好的服务:

     resource.get().$promise
        .then(function (response) {
        // do something with the response
        }, function (error) {
            // pass the error the the error service
            return errorService.handleError(error);
        });

下面是我们如何在 Karma 中触发错误:

     resourceMock.get = function () {
        var deferred = $q.defer();
        deferred.reject(error);
        return { $promise: deferred.promise };
    };

现在,随着更新到 1.6.0,Angular 突然在我们的单元测试(在 Karma 中)中抱怨被拒绝的承诺,并出现“可能未处理的拒绝”错误。但是我们正在处理调用错误服务的第二个函数中的拒绝。

Angular 到底在寻找什么?它希望我们如何“处理”拒绝?

原文由 Groucho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 261
2 个回答

尝试将此代码添加到您的配置中。我曾经遇到过类似的问题,这个变通办法解决了问题。

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

原文由 Cengkuru Michael 发布,翻译遵循 CC BY-SA 3.0 许可协议

您显示的代码将处理在调用 .then 之前发生的拒绝。在这种情况下,将调用您传递给 .then 的第二个回调,并处理拒绝。

_但是_,当您调用 .then 的承诺成功时,它会调用第一个回调。 _如果此回调抛出异常或返回被拒绝的承诺,则不会处理由此产生的拒绝_,因为第二次回调不处理第一次引起的拒绝。这就是符合 Promises/A+ 规范的 promise 实现的工作方式,并且 Angular promises 是兼容的。

您可以使用以下代码来说明这一点:

 function handle(p) {
    p.then(
        () => {
            // This is never caught.
            throw new Error("bar");
        },
        (err) => {
            console.log("rejected with", err);
        });
}

handle(Promise.resolve(1));
// We do catch this rejection.
handle(Promise.reject(new Error("foo")));

如果你在 Node 中运行它,它也符合 Promises/A+,你会得到:

 rejected with Error: foo
    at Object.<anonymous> (/tmp/t10/test.js:12:23)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
(node:17426) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: bar

原文由 Louis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题