我正在使用的API提供了这样的链接头:
</resource?page=1&limit=10>; rel="next",
</resource?page=1&limit=10>; rel="last",
</resource?page=0&limit=10>; rel="first"
我需要循环使用/resource
端点,一次消耗10个对象,直到链接头(最后一页)中不再有next
为止。
我有这样的资源
myResources.factory('MyResource', [
'$resource',
function($resource) {
const ENDPOINT = '/api/resource/:id';
return $resource(ENDPOINT, null, {
query: {
method: 'GET',
isArray: true,
interceptor: {
response: function(response) {
response.resource.headers = response.headers;
return response.resource;
}
}
}
});
}]);
我也有这样的服务:
myServices.factory('MyResourceService', [
function(MyResource) {
return {
findResources: function(){
return MyResource.query().$promise;
},
findAllResources: function(){
// I need to return a promise which will fetch all
// results from the server synchronously
var hasNext = true;
var params = {limit: 10, page: 0};
var chain = $q.all();
while(hasNext){
chain = chain.then(function(){
return MyResource.query(params).then(function(res){
var next = linkHeaderParser.parse(res.headers('link').next);
if(next) params = {limit: next.limit, page: next.page};
else hasNext = false;
}, function(){
hasNext = false;
});
});
}
return chain;
},
...
};
}]);
好吧,您的眼睛可能会受伤,因为我知道这不是实现此目标的适当方法,因为hastNext
在承诺实际执行之前没有更新,因此会导致无限循环。但是我无法解决这个问题。任何帮助表示感谢,谢谢。
答案 0 :(得分:0)
var getResource = function(params){
return MyResource
.query(params)
.$promise;
};
// Method that extracts the last page
var pageCount = function(response){
var last =
linkHeaderParser.parse(response.headers('link')).last;
return parseInt(last.page);
};
params.limit = 0;
params.page = 0;
var deferred = $q.defer();
var resources = [];
// Method that extracts the last page
getResource(params)
.then(function(res){
var promises = [];
var lastPage = pageCount(res);
resources = resources.concat(res);
// Loop to get all pages
for(var i = params.page + 1; i <= lastPage; i++){
params.page = i;
promises.push(getResource(params));
}
return $q.all(promises);
}, function(err){
if(err.headers('x-pagination-count') &&
parseInt(err.headers('x-pagination-count')) === 0)
return $q.all([]);
}
})
.then(function(res){
// Concat results and resolve the promise
for (var i = 0; i < res.length; i++){
resources = resources.concat(res[i]);
}
deferred.resolve(resources);
});