如何缓存响应我的承诺?

时间:2015-07-02 14:15:51

标签: angularjs ionic-framework angular-promise

我正在使用Ionic创建一个混合应用程序,它将加载存储在设备上的一些JSON文件。由于相同的数据将用于几种不同的状态,我认为将响应存储到JSON请求并重用它是有意义的,而不是一遍又一遍地重新读取JSON文件。

This question seems to address that scenario,但我似乎无法让它发挥作用。虽然模板在我使用更简单的$ http.get()。success()请求时起作用,但是自从我开始尝试使用此服务以来它永远不会填写。

app.factory('localJsonService', function($http, $q) {
  var localJsonService = {};

  localJsonService.returnLegislators = function() {
    if (this.legislators) {
      return $q.when(this.legislators);
    }
    return $http.get('/data/legislators.json').then(function(response) {
      this.legislators = response.data;
      return this.legislators;
    });
  }

  return localJsonService;
});

//old malfunctioning controller
app.controller('profileController', function($scope, $stateParams, localJsonService) {
  $scope.legislators = localJsonService.returnLegislators();
  $scope.legislator = $scope.legislators[$stateParams.seq_no-1];
  console.log($scope.legislator); //displays undefined
});

//EDIT: newer, working controller (but still loads JSON file on each new state)
app.controller('profileController2', function($scope, $stateParams, localJsonService) {
  localJsonService.getLegislators().then(function(legislators){
    $scope.legislator = legislators[$stateParams.seq_no-1];
  });
});

这只是对我失踪的服务的一个简单改变吗?或者我完全以错误的方式解决这个问题?我正在运行AngularJS v1.3.13,但我不反对其他版本,如果这样做会有所帮助。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

使用promise回调并在该回调中分配变量:

localJsonService.returnLegislators().then(function(legislators){
    $scope.legislators = legislators;
    $scope.legislator = legislators[$stateParams.seq_no-1];
    console.log($scope.legislator); 
});

答案 1 :(得分:1)

如果服务数据响应没有改变,我宁愿用户localStorage来缓存你的响应。我建议你ngStorage,这样可以很容易地使用localStorage和sessionStorage。

P.S:如果数据正在改变,那么使用sessionStorage,会话持续存在,但在应用程序重启后清除。

注入$ localStorage后的示例:

设置默认值:

 var jsonDefaultVariable = {};
     jsonDefaultVariable["myDatas"] = false;
 $localStorage.$default(jsonDefaultVariable);

检查缓存:

if($localStorage["myDatas"] !== false){
    factory.myDatas = $localStorage.myDatas;
}else{
   $http(....).success(function(data){
      $localStorage.myDatas = data;
      factory.myDatas = data;
   });