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

时间:2014-05-03 15:09:15

标签: javascript angularjs deferred javascriptmvc angular-services

我尝试创建一个角度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

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

2 个答案:

答案 0 :(得分:3)

你有2个问题

  • 在第一次通话时,您返回的承诺将通过undefined解决,因为您从then来电中$http.get成功回拨中没有返回任何内容。如果你从该回调中返回that.likesForMe,我怀疑它会按预期工作。你应该阅读链接承诺。 (无耻的插件:我写了一个blog post on AngularJS promises,其中包含关于链接的部分)

  • 代码对于它的功能而言非常复杂,如果您正在使用现有的承诺,那么您几乎不必通过$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;
       });
    });
    

您还可以在docs for $http cache中阅读,看看您是否可以提出使用它的解决方案。

答案 1 :(得分:0)

如果您更喜欢控制器代码的更高版本,则无法从服务返回承诺。

您可以返回一个空对象,当您从http调用返回时,该对象将被扩充。

然后您必须发出$rootScope.$apply(),以便通知您的控制器。