我如何在Angular中执行http请求,并且具有返回Json的所有元素或仅返回一个元素的函数?

时间:2015-10-08 17:43:44

标签: json angularjs promise angular-promise angular-http

我是Angular和Ionic的新人, 我想建立一个从googleapis获得一个Json的工厂, 并包含两个函数,一个返回所有元素,另一个返回参数中传递索引的元素。

我试着这样做:

厂:

angular.module('starter.services', [])

.factory('Noticias', function($http,$q) {
  var deferred = $q.defer();                
        $http.get("http://ajax.googleapis.com/ajax/services/feed/load", { params: { "v": "1.0", "q": "http://www.furg.br/bin/rss/noticias.php", "num":"10" } })
          .success(function(data) {
              entries = data.responseData.feed.entries;
              deferred.resolve(entries);
          })
          .error(function(data) {
              console.log("ERROR: " + data);
          });

  var noticias =  deferred.promise;
  console.log(noticias);
  return {
    all: function() {
      return noticias;
    },
    remove: function(noticia) {
      noticias.splice(noticias.indexOf(noticia), 1);
    },
    get: function(noticiaId) {
      for (var i = 0; i < noticias.length; i++) {
        if (noticias[i].id === parseInt(noticiaId)) {
          return noticias[i];
        }
      }
      return null;
    }
  };
});

我在控制台中得到了这个,但我想要的是&#34;值&#34;在控制器。

Promise {$$state: Object, then: function, catch: function, finally: function}$$state: Object
status: 1
value: Array[10]
0: Object
1: Object
2: Object
3: Object
4: Object
5: Object
6: Object
7: Object
8: Object
9: Object
length: 10
__proto__: Array[0]
__proto__: Object
__proto__: Object

3 个答案:

答案 0 :(得分:1)

noticias是一个承诺。并且您的所有方法都使用它,就像它是一个数组一样。不是。这是一个承诺。

因此,方法get例如应为

get: function(noticiaId) {
    return noticias.then(function(array) {
        for (var i = 0; i < array.length; i++) {
            if (array[i].id === parseInt(noticiaId)) {
                return array[i];
            }
        }
        return null;
    });
}

并且get()方法的用户应该像这样使用它:

service.get(i).then(function(element) {
    // do something with element
});

另请注意,您定义承诺的方式是反模式。如果http请求失败,则永远不会拒绝noticias承诺。使用承诺链:

var noticias = $http.get("http://ajax.googleapis.com/ajax/services/feed/load", { params: { "v": "1.0", "q": "http://www.furg.br/bin/rss/noticias.php", "num":"10" } })
      .then(function(response) {
          return response.data.responseData.feed.entries;
      });

答案 1 :(得分:0)

我相信你想这样做:

            ProgressDialog progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("[YOUR MESSAGE]");
            progressDialog.setCancelable(true); // Check as required
            progressDialog.show();*/

答案 2 :(得分:0)

我的解决方案: 基于:https://stackoverflow.com/a/33023283/5424391

angular.module('starter.services', [])

.factory('Noticias', function($http,$q) {

  var noticias = $http.get("http://ajax.googleapis.com/ajax/services/feed/load", { params: { "v": "1.0", "q": "http://www.furg.br/bin/rss/noticias.php", "num":"20" } })
    .then(function(response) {
        return response.data.responseData.feed.entries;
    });

  return {
    all: function() {
      return noticias.then(function(array){
        return array;
      });
    },
    get: function(noticiaIndex) {
    return noticias.then(function(array) {
        return array[parseInt(noticiaIndex)];        
    });
  }
  };
});