【问题标题】:How do I cache the response to my promise?如何缓存对我的承诺的响应?
【发布时间】:2015-07-11 23:27:56
【问题描述】:

我正在使用 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,但我不反对其他版本,如果这有帮助的话。

感谢您能给我的任何帮助。

【问题讨论】:

    标签: angularjs ionic-framework angular-promise


    【解决方案1】:

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

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

    【讨论】:

    • 我的回答失败了,但这看起来是对的。不过,该服务似乎正在返回一个单一的立法者,所以legislators[$stateParams.seq_no-1] 炸弹不会吗?
    • @KreepN 是的,服务返回的内容似乎不匹配。我认为这是一个错字,在$http.get 内应该是legislatorss
    • 这么想,感谢您指出我的错误,我忘记了 httpget 返回一个承诺。 +1
    • 这有帮助(屏幕现在可以正确渲染),但我的服务似乎也有问题。当我打开浏览器控制台到网络选项卡时,我可以看到每次 UI 状态返回到此控制器时都会一次又一次地请求 JSON 文件。我的目标是让 $http 请求的文件只有一次。
    • 可以在$http.get 中使用cache:true ...请求只会发出一次,您不需要$q.when
    【解决方案2】:

    如果服务数据响应没有变化,我宁愿使用 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;
       });
    

    【讨论】:

    • 虽然我想弄清楚如何编写自己的服务来处理这个问题,但我最终可能会使用这个库。看起来用起来很方便,谢谢。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2020-09-10
    • 2021-04-10
    • 2019-11-17
    • 2020-04-05
    • 2019-04-26
    相关资源
    最近更新 更多