我尝试创建一个角度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
。
我是延迟对象的新手,我的英语很差,但我希望你能理解错误的位置。非常感谢!
答案 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()
,以便通知您的控制器。