【问题标题】:$resource resolve in ui-router error catching don't fail stateui-router 错误捕获中的 $resource 解析不会失败状态
【发布时间】:2016-10-14 20:21:50
【问题描述】:

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

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

但是,如果这个 promise 失败,整个状态将被中止并抛出 $stateChangeError。我不想中止整个状态,只需将项目的值设置为默认值并继续进入状态。我能找到的唯一解决方案似乎是 hack:

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;
            }]

这样,无论请求是否失败,promise 都将解析并且状态将继续。这个问题有更简单的解决方案吗?

如果重要的话,我会在解析中使用它,因为信息会影响页面的流程,我不希望它在加载数据之前加载页面

【问题讨论】:

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


    【解决方案1】:

    简化问题:

    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:
    从文档中的这个代码示例:

    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"}];
                    });
                }]
    

    不,在延迟服务中包含承诺是不好的 ($q)。除非你有多个 Promise。

    【讨论】:

    • 我相信使用 $promise 是强制性的。为了在路由器中正常工作的解析,它必须被提供一个 $promise 而不仅仅是资源操作
    • 我认为查询是您编写的服务,而不是角度资源 API
    • 这个例子是在使用常规 Promise 调用自定义服务时。我认为您的代码没有问题。如果它适用于您的 API
    • 你说我的代码是指第二个代码sn-p吗?你认为用另一个 $q 围绕资源调用(其中有一个 $q)在风格上可以吗?
    【解决方案2】:

    终于解决了....关键是在资源方法定义中加入一个带有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"}];
                    }
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多