javascript - 使用 .catch() 处理 $routeChangeError

标签 javascript angularjs angular-promise

我正在使用 ngRoute 做一些基本的路由。我定义了一个使用 $http 的服务并将其插入 resolve。通常我在服务中显式使用 $q,但这次我使用内置的 .then.catch,但它不是像往常一样工作。这是我所拥有内容的简化版本:

app.config(["$routeProvider", "$locationProvider", 
    function($routeProvider, $locationProvider){
        $locationProvider.html5Mode(false);

        $routeProvider
            .when("/", {
                templateUrl: "views/index.html",
                controller: "indexCtrl",
                resolve: {
                    myData: function(myService){
                        return myService.getMyData();
                    }
                }
            })

            .otherwise({
                templateUrl: "views/404.html"
            });
    }]);

服务:

app.factory("myService", ["$http", "$route", function($http, $route){
    return {
        getMyData: function(){
            return $http.get("www.url.com")
                .then(function(data){
                    return data;
                })
                .catch(function(err){
                    return {err: "There was an error"};
                })
        }
    }
}]);

以及处理错误的 Controller :

app.controller("errorCtrl", ["$rootScope", function($rootScope){

    $rootScope.$on("$routeChangeError", function(event, current, previous, rejection){
        console.log("err", rejection);
    })

}]);

在 View 中:

<body ng-app="App" ng-controller="errorCtrl" ng-view>

问题是 catch() 返回的值没有传递给 routeChangeError 处理程序的 rejection 参数。我通常会使用 deferred.reject(data) 传递数据,但我不知道为什么 .catch() 的工作方式不同。事实上,.catch block 似乎根本没有受到攻击。如果我进入服务并尝试破坏某些东西,这会触发 Controller 中的 routeChangeError 处理程序,但不会触发 catch block 。只是想知道是否有人可以提供一些关于这里发生的事情的见解?

最佳答案

如果您从 catch返回,则您已经处理了 错误,并且生成的 promise 将得到实现。另见 Chained promises not passing on rejection .

如果你想要拒绝,你将需要重新抛出一个错误(或返回一个被拒绝的 promise ):

getMyData: function(){
    return $http.get("www.url.com")
    .catch(function(err){
        throw new Error("There was an error");
    })
}

(我也删除了无用的.then(identity))

关于javascript - 使用 .catch() 处理 $routeChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337429/

相关文章:

javascript - 如何使用 Keydown 事件在多种语言/键盘布局中获取正确的字符?

javascript - For Var In Loop - 我可以从中省略变量吗?

javascript - 我可以使用 Angular JS ng-repeat 和 Turn.js 吗?

angularjs - Protractor 使用 jasmine-reporters 测试报告

javascript - Angular 是否有一个包含所有当前 Promise 的预定义对象?

AngularJs Controller ,等待服务 $http 结果

javascript - 从 Angularjs Controller 和服务的 for 循环中调用多个 $http 服务 javascript Promise 问题

javascript - 如何更改属于 JS/jQuery 中特定行的按钮文本?

javascript - 如何在 nashorn 中转换 java 类?

java - 如何修复 org.jvnet.mimepull.MIMEParsingException?