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

标签 javascript angularjs deferred javascriptmvc angular-services

我正在尝试创建一个 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;
  }

当前 Controller 代码:

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

首选 Controller 代码:

$scope.likesList = MainUser.getLikesForMe();

但目前它仅在第二个函数 (getLikesForMe()) 调用后起作用,在第一个 - 列表为空且“结果”变量为 未定义

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

最佳答案

你有两个问题

  • 在第一次调用时,您返回的 promise 将通过 undefined 解析,因为您没有从调用到的 then 成功回调中返回任何内容$http.get。如果您从该回调中返回 that.likesForMe,我怀疑它会按您预期的那样工作。您可能应该阅读有关链接 promise 的内容。 (不要脸的插件:我写了一个blog post on AngularJS promises,里面有链接的部分)

  • 该代码的功能相当复杂,如果您所做的只是使用现有的,您几乎永远不必通过 $q.defer() 创建一个 promise promise 。它通常会使事情变得更复杂,更难处理错误。您也可以使用 $q.when()从非 promise 值创建 promise 。所以我提出类似的建议

    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看看您是否可以想出一个使用它的解决方案。

关于javascript - 缓存服务器响应(AngularJS,延迟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23446148/

相关文章:

javascript - Jquery .show() 不显示具有隐藏可见性的 div

javascript - 获取谷歌索引的动态文本

用于 float 的 Python 中的 JavaScript toString(16)?

javascript - jQuery.each : Do not add comma in last field

javascript - 使用 ASP.NET Web API 下载二进制数据时,AngularJS GET byte[] 错误

css - 使用延迟 CSS 加载时改进 UI

angular - 相当于 $q.when 在 Angular 2

javascript - Promise 链(angular javascript)

javascript - AngularJs $http 不适用于跨域

postgresql - 设置约束可延迟不适用于 PostgreSQL 事务