Angularjs Angular JS从factory AJAX请求保存信息

Angularjs Angular JS从factory AJAX请求保存信息,angularjs,ajax,http,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({

我有一个工厂,使用$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;
    }
  }
}
因此,它获取数据并将其放入一个对象中。如果我错了,请纠正我,但是这种使用工厂进行此类操作的方法是这样的,它不与控制器绑定,并且可以在我的应用程序中的任何地方使用

考虑到这一点,我希望这样我就可以在我的应用程序中的任何地方获取数据,而不必每次都查询服务器。i、 e.一旦查询到服务器,工厂就会保存对对象的响应(就像我现在所做的那样)。但是,例如,我在访问另一个控制器中的数据时遇到问题

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

我不确定我的观点是否正确


谢谢

您正在返回一个承诺,因此您需要始终返回一个承诺,即使是在缓存响应上,您也可以通过将其包装在$q.when($q)中来完成此级别的操作,它将立即返回一个承诺

return $q.when(obj);
虽然$http服务内置了缓存,但是您可能需要查看缓存部分

$http

这应该可以: 而不是将obj=[]赋值为空。通常我更喜欢回叫。您可以尝试以下代码:

.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
   })

您可能会发现这篇文章非常有用: