具有多个依赖查询的AngularJS服务

时间:2016-03-19 16:24:36

标签: angularjs rest http service factory

我正在尝试创建一个AngularJS服务,该服务根据多个HTTP请求返回数据。但我似乎只是没有让它工作。

REST调用如下:

  • get / index返回一个url数组
  • 调用每个网址,并将结果添加到数组

我希望在服务函数调用结束时,我会收到一个包含来自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;
                  });
              });
          }

也许有人可以指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

这是链接承诺并使用$ q.all()的典型情况就足够了:

EbookDTO

这避免了回调反模式,并使用链接。这里解释有点长,但我写了一篇博文,希望能够使上述代码清晰明确:http://blog.ninja-squad.com/2015/05/28/angularjs-promises/