ui-在 resolve 中添加 $http 或 restangular 时路由器冻结

ui-router freezing when adding either $http or restangular inside resolve

所以我解决了 ui-router/angular unpr 问题!现在,我想知道为什么 ui-router 在我添加 $http 或 restangular 调用后不会继续。也许我的延迟语法是错误的。这是代码

.state("main", {
    url: "/",
    views: {
        '' : { templateUrl: 'views/main.html' },
        'performance-ui-view@main': {
            templateUrl: 'views/gdreport.html',
            resolve: {
                propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
                    var deferred = $q.defer();
                    RestFactory.setBaseUrl(ApiEndpoints.DataService);
                    RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
                        .then(function(response) {
                            $rootScope.userData.isGlobalAccount = true;
                            User.saveData();
                            deferred.resolve(response);
                            return deferred.promise;
                        }, function(err){
                            // f'ing work around, I've already told 401 to our backend dev
                            $rootScope.userData.isGlobalAccount = false;
                            userData.saveData();
                            deferred.resolve(response);
                        })
                }
            },
            controller : 'GlobalDashboardController'
        }
    }
})

不确定错误可能是什么(因为问题中未提及),似乎您没有按预期从 resolve 函数返回承诺。

  propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
        var deferred = $q.defer();
        RestFactory.setBaseUrl(ApiEndpoints.DataService);
        RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
            .then(function(response) {
                $rootScope.userData.isGlobalAccount = true;
                User.saveData();
                deferred.resolve(response);

            }, function(response){
                // f'ing work around, I've already told 401 to our backend dev
                $rootScope.userData.isGlobalAccount = false;
                userData.saveData();
                deferred.resolve(response);
            });
      return deferred.promise; //<-- Here
    }

但是你可以不用创建延迟的对象,因为你的 api 调用已经 returns 一个承诺,只需做:

  propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {

        RestFactory.setBaseUrl(ApiEndpoints.DataService);
        return RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
            .then(function(response) {
                $rootScope.userData.isGlobalAccount = true;
                User.saveData();
                return response;

            }, function(response){
                $rootScope.userData.isGlobalAccount = false;
                userData.saveData();
                return response;
            });

    }