缓存服务器响应(AngularJS,延迟)
Cache server response (AngularJS, deferred)
我正在尝试创建一个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
。
我是延迟对象的新手,我的英语很差,但我希望你能理解错误在哪里。非常感谢!
你有两个问题
-
在第一次调用时,您返回的承诺将与
undefined
解决,因为您没有从调用$http.get
的then
成功回调中返回任何东西。如果你从那个回调返回that.likesForMe
,我怀疑它会像你期望的那样工作。你应该仔细研究一下连锁承诺。(无耻的插件:我写了一篇关于AngularJS承诺的博客文章,其中包含链接部分) -
代码是相当复杂的,它做什么,你几乎从来没有通过
$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; }); });
您也可以在文档中阅读$http
缓存,看看您是否可以提出一个解决方案,使用它
如果你更喜欢最新版本的控制器代码,那么你就不能从服务返回承诺。
你可以返回一个空对象,当你从http调用中返回时,它将被增强。
你必须发出一个$rootScope.$apply()
,这样你的控制器就会收到通知。
相关文章:
- 延迟 AngularJS 路由更改,直到加载模型以防止闪烁
- Asp.net MVC Angularjs 奇怪的延迟
- 如何使用angularjs延迟加载谷歌jsapi图表
- Angularjs模型更新延迟
- AngularJS正在等待CSS延迟加载
- 如何使用AngularJS在延迟后启用按钮
- AngularJS搜索延迟,直到用户输入字段
- angularjs ng-include中html文件的延迟包含
- Javascript 或 angularjs 在刷新之间延迟浏览器关闭或选项卡关闭
- 如何处理 AngularJS 中 $http.post 的延迟
- MouseEnter 事件失火,即使在 AngularJS 中也有延迟
- AngularJS:承诺链不延迟超过第二个函数
- AngularJS延迟承诺不推迟
- AngularJS 1.2.0:延迟加载控制器和模板
- AngularJS中ngRepeat集合中的延迟加载项
- 带有 angularjs 和 requirejs 的延迟加载模块
- 弹出框延迟显示在鼠标输入(Angularjs)上
- 为什么 AngularJS 不能与多个延迟脚本一起工作
- 如何在对 AngularJS 控制器进行单元测试时模拟网络延迟
- 需要帮助来延迟angularjs中的搜索结果