我正在运行一个具有解决方案的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;
}]
有了这个,无论请求是否失败,承诺都将解决,状态将继续。这个问题有没有更简单的解决方案?
如果重要,我会在解决方案中使用它,因为信息会影响页面流,我不希望它加载页面直到加载数据
答案 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"}];
}
}
}