1

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

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

4

2 回答 2

3

你有2个问题

  • 在第一次调用时,您返回的承诺将被解决,undefined因为您没有then从调用的成功回调中返回任何内容$http.get。如果您that.likesForMe从该回调中返回,我怀疑它会按您的预期工作。您可能应该阅读链接承诺。(无耻的插件:我写了一篇关于 AngularJS 承诺的博客文章,其中包含有关链接的部分)

  • $q.defer()代码的作用相当复杂,如果你正在做的所有事情都是使用现有的 Promise ,那么你几乎不需要创建一个Promise。它通常会使事情变得更复杂,更难处理错误。您还可以使用$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缓存以查看是否可以提出使用它的解决方案。

于 2014-05-03T17:19:33.493 回答
0

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

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

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

于 2014-05-03T15:33:03.800 回答