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