来自工厂AJAX请求的Angular JS保存信息

时间:2016-03-29 17:15:43

标签: angularjs ajax http

我有一个工厂,我使用$ http方法从服务器获取数据:

.factory('$factory', function ($q, $http, $timeout, $state, $ionicHistory, $localstorage) {
  var obj = [];

  var functions = {
    getData: function () {

      var dfd = $q.defer();
      if(!obj){
        $http({
          url: remoteUrl+'/getdata',
          method: 'POST',
          data: {}
        }).then(function(response) {
          $timeout(function(){
            obj = response.data;
            dfd.resolve(response.data);
          }, 2000)
        }, function(response) {

        }   
      }else{
        return obj;
      }
      return dfd.promise;
    }
  }
}

因此,这将获取数据并将其放入对象中。如果我错了,请纠正我,但这种使用工厂进行此类操作的方法是这样的,它不依赖于控制器,可以在我的应用程序中的任何地方使用。

考虑到这一点,我希望这样做,这样我就可以在我的应用程序中的任何位置获取数据,而无需每次都查询服务器。即,一旦查询服务器,工厂就会将响应保存到对象中(就像我现在正在做的那样)。但是我之后在另一个控制器中访问数据时遇到了麻烦。

我已经开始通过使用if(!obj)行来制作我认为它应该是什么样子,但是在else语句中我似乎只能返回obj对象。它会抛出错误,因为它没有像预期的那样返回一个承诺。

我不确定我是否与此相符。

由于

2 个答案:

答案 0 :(得分:2)

你正在返回一个承诺,所以你需要总是在缓存的响应中返回一个承诺,你可以通过将它包装在$ q.when(https://docs.angularjs.org/api/ng/service/ $ q)中来相对容易地做到这一点。这将立即得到答复。

return $q.when(obj);

虽然$ http服务内置缓存,但您可能需要查看缓存部分。

https://docs.angularjs.org/api/ng/service/ $ HTTP

https://www.ng-book.com/p/Caching/

答案 1 :(得分:1)

这应该有效: Insteada将obj = []赋值为null。通常我更喜欢回调。您可以尝试以下代码:

.factory('$factory', function($q, $http, $timeout, $state, $ionicHistory, $localstorage) {
var obj = [];

var functions = {
    getData: function(cb) {
        // instead of checking !obj you have to check for length or you have to set obj as null
        if (obj && obj.length == 0) {
            $http({
                url: remoteUrl + '/getdata',
                method: 'POST',
                data: {}
            }).then(function(response) {
                    obj = response.data;
                    cb(response.data)
                }, function(response) {

                }
            }
            else {
                cb(obj)
            }
        }
    }
  }
 })
 // You can use callback by following code

   $factory.getData(function(response){
   // response will come here
   })