如何将$ http.get的结果存储到变量中

时间:2016-04-17 18:33:50

标签: javascript angularjs

我有以下场景,我需要来自特定url的数据。我还需要将这个数据保存到一个变量中,我可以在控制器中的任何地方调用它。为了克服这个问题,我写了一个如下服务:

app.service("userData", function ($http, $q) {

var deferred = $q.defer();

this.getUsers = function () {
    return $http.get('/users')
        .then(function (response) {
            deferred.resolve(response.data);
            return deferred.promise;
        }, function (response) { 
            deferred.reject(response);
            return deferred.promise;
        })
    ;
};
});

然后我的控制器看起来像:

  app.controller('UserCtrl', function($scope, $q, userData) {
  var myData = userData.getUsers()
  .then(
      function (result) {
          $scope.users = result;
      },
      function (error) {
          console.log(error.statusText);
      }
  );
  console.log(myData)
  });

打印:

print screen

那么如何将数据存储到一个可以在整个控制器上访问的变量中呢? 感谢..

1 个答案:

答案 0 :(得分:1)

我建议你这样:

    angular.module("app").factory("userService", userService);

    userService.$inject = ["$http", "$q"];

function userService($http, $q) {
    var deferred = $q.defer();
    var promise = null;
    var currentUser = null;
    return {
        getUserInfo: function () {
            if (promise) {
                deferred.resolve(currentUser);
                return (currentUser) ? deferred.promise : promise;
            }
            else {
                promise = $http.get("http://swapi.co/api/people/1/").then(function (response) {
                    return currentUser = response.data.name;
                });
                return promise;
            }    
        }
    }
}

您可以随时调用userService.getUserInfo()来获取缓存数据。

   .config(['$routeProvider', function ($routeProvider) {
        $routeProvider.when('/view1', {
            templateUrl: 'view1/view1.html',
            controller: 'View1Ctrl',
            controllerAs: 'vc'
        });
    }])

    .controller('View1Ctrl', function (userService) {
            var vm = this;
            userService.getUserInfo().then(function (result) {
                vm.name = result
            }, function (err) {
                vm.name = err
            });
        });

我创建了一个git存储库来测试它:https://github.com/leader80/angular-cache-service

我希望它有所帮助