我正在尝试创建一个AngularJS服务,该服务根据多个HTTP请求返回数据。但我似乎只是没有让它工作。
REST调用如下:
我希望在服务函数调用结束时,我会收到一个包含来自url的所有数据的数据结构。
我当前有点工作的代码使用回调,但即使它在一个控制器中工作,它也不在另一个控制器中。我想正确使用承诺,但我已经与成功相提并论。
我的服务:
// Get a image
obj.getByUrl = function (imageUrl, callback) {
$http.get('https://localhost:9000' + imageUrl).success(function (data) {
callback(data);
});
}
// Get all images
obj.getAll = function(callback) {
$http.get('https://localhost:9000/1.0/images').success(function (data) {
if (data.status != "Success") {
console.log("Err");
}
var images = [];
for(var n=0; n < data.metadata.length; n++) {
var c = data.metadata[n];
obj.getByUrl(c, function(data2) {
images.push(data2.metadata);
});
}
callback(images);
});
}
我想在控制器中使用该服务,如下所示:
resolve : {
images: function(ImagesServices, $route) {
return ImagesServices.getState($route.current.params.containerName)
},
我到目前为止,但它只返回索引调用的数据,而不是聚合数据:
obj.getAll3 = function() {
var images = [];
var promises = [];
//var httpPromise = $http.get('https://localhost:9000/1.0/images');
var httpPromise = $http({
url: 'https://localhost:9000/1.0/images',
method: 'GET',
});
return httpPromise.success(function(data) {
var data2 = data.metadata[0];
// angular.forEach(data.metadata, function(data2) {
console.log("D11: " + JSON.stringify(data2));
//var inPromise = $http.get('https://localhost:9000' + data2)
var inPromise = $http({
url: 'https://localhost:9000' + data2,
method: 'GET',
})
.success(function (data2) {
console.log("D2: " + JSON.stringify(data2));
images.push(data2);
});
promises.push(inPromise);
// });
return $q.all(promises).then(function() {
return images;
});
});
}
也许有人可以指出我正确的方向?
答案 0 :(得分:0)
这是链接承诺并使用$ q.all()的典型情况就足够了:
EbookDTO
这避免了回调反模式,并使用链接。这里解释有点长,但我写了一篇博文,希望能够使上述代码清晰明确:http://blog.ninja-squad.com/2015/05/28/angularjs-promises/