在ui-router错误捕获中的$ resource解析没有失败状态

时间:2016-10-14 20:21:51

标签: angularjs angular-ui-router angular-resource

我正在运行一个具有解决方案的ui-router,解析后的数据如下所示:

myService: "myService"
items: function(myService){
                var promise = myService.resource.query().$promise;
                return promise;
            }

但是,如果此promise失败,则整个状态将中止并抛出$ stateChangeError。我想要而不是中止整个状态,只需将items的值设置为默认值并继续执行状态。我能找到的唯一解决方案似乎是黑客攻击:

myService: "myService",
items: ['myService', '$q', function(myService, $q) {
                //return []
                defObj = $q.defer();
                var promise = myService.resource.query().$promise;
                promise.then(function(data) {
                    defObj.resolve(data);
                },function(error) {
                    defObj.resolve([{title: "sorry, could not load"}]);
                })
                return defObj.promise;
            }]

有了这个,无论请求是否失败,承诺都将解决,状态将继续。这个问题有没有更简单的解决方案?

如果重要,我会在解决方案中使用它,因为信息会影响页面流,我不希望它加载页面直到加载数据

2 个答案:

答案 0 :(得分:0)

简化问题:

myService: "myService"
items: function(myService){
   return myService.resource.query();
}

解决方案:

myService: "myService"
items: function(myService){
   return myService.resource.query()
     .then(function(data) {
        return data;
      }, function() {
         return [{title: "sorry, could not load"}];
      });
}

编辑: 上面的代码是用于返回Promise的简单服务调用。

对于$ ressource api:
来自docs的代码示例:

User.get({userId:123})
    .$promise.then(function(user) {
      $scope.user = user;
    });

我想你可以简化这个:

myService: "myService",
items: ['myService', function(myService) {
              return myService.resource.query().$promise
                .then(function(data) {
                    return data;
                },function(error) {
                    return [{title: "sorry, could not load"}];
                });
            }]

不,在deferred服务($q)中包含承诺并不好。除非你有多个Promises。

答案 1 :(得分:0)

最后解决了....关键是在资源方法定义

中添加一个带有responseError函数的拦截器
 "query": {
            method: "GET",
            isArray: true,
            /*This will prevent the promise from being rejected even on fail*/
            interceptor: {
                responseError: function() { 
                    return [{title: "Sorry, could not load"}];
                }
            }

        }