【问题标题】:Angular JS saving information from factory AJAX requestAngular JS 保存来自工厂 AJAX 请求的信息
【发布时间】:2016-03-30 02:18:12
【问题描述】:

我有一个工厂,我使用 $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 对象。它会引发错误,因为它也没有像预期的那样返回承诺。

我不确定我是否符合正确的路线。

谢谢

【问题讨论】:

标签: angularjs ajax http


【解决方案1】:

您正在返回一个承诺,因此即使在缓存的响应中您也需要始终返回一个承诺,您可以通过将其包装在 $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/

【讨论】:

    【解决方案2】:

    这应该有效: 而是将 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
       })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2016-06-06
      • 2010-09-24
      • 2019-03-23
      相关资源
      最近更新 更多