缓存服务器响应(AngularJS,延迟)

Cache server response (AngularJS, deferred)

本文关键字:延迟 AngularJS 服务器 响应 缓存      更新时间:2023-09-26

我正在尝试创建一个angular js服务,如果需要更新,它将从服务器获取数据,如果没有更新,它将返回缓存数组。在这两种情况下,服务都应该返回一个promise。服务代码:

getLikesForMe = function() {
    var defer = $q.defer(), prom = defer.promise;
    if (angular.isUndefined(this.likesForMe) ||
        updateStatus.likesForMe === true) {
      var that = this;
      prom = $http.get(API_URL + 'likes-to.json')
        .then(function(result){
          updateStatus.likesForMe = false;
          that.likesForMe = result.data;
        });
    } else {
      defer.resolve(this.likesForMe);
    }
    return prom;
  }

当前控制器代码:

MainUser.getLikesForMe().then(function(result) {
  $scope.likesList = result;
});

首选控制器代码:

$scope.likesList = MainUser.getLikesForMe();

但目前它只在第二个函数(getLikesForMe())调用后工作,在第一个-列表为空,"结果"变量为undefined

我是延迟对象的新手,我的英语很差,但我希望你能理解错误在哪里。非常感谢!

你有两个问题

  • 在第一次调用时,您返回的承诺将与undefined解决,因为您没有从调用$http.getthen成功回调中返回任何东西。如果你从那个回调返回that.likesForMe,我怀疑它会像你期望的那样工作。你应该仔细研究一下连锁承诺。(无耻的插件:我写了一篇关于AngularJS承诺的博客文章,其中包含链接部分)

  • 代码是相当复杂的,它做什么,你几乎从来没有通过$q.defer()创建一个承诺,如果你所做的工作与现有的承诺。它通常会使事情变得更复杂,更难处理错误。您还可以使用$q.when()从非承诺值创建承诺。所以我建议输入

    getLikesForMe = function() {
      var that = this;
      var useCache = !updateStatus.likesForMe && !angular.isUndefined(this.likesForMe);
      return useCache ? $q.when(that.likesForMe) : $http({
        method: 'GET',
        url: API_URL + 'likes-to.json'
       }).then(function(results) {
         updateStatus.likesForMe = false;
         that.likesForMe = results.data;
         return that.likesForMe;
       });
    });
    

您也可以在文档中阅读$http缓存,看看您是否可以提出一个解决方案,使用它

如果你更喜欢最新版本的控制器代码,那么你就不能从服务返回承诺。

你可以返回一个空对象,当你从http调用中返回时,它将被增强。

你必须发出一个$rootScope.$apply(),这样你的控制器就会收到通知。