在AngularJS中使用$q同步读取服务器数据
来源:互联网 发布:大数据hadoop论文 编辑:程序博客网 时间:2024/05/04 04:01
今天在写AngularJS Service,然后希望在Controller中使用Service提供Model。架构上,我希望Controller可以直接获得数据,因此有了“同步读取”数据的想法。
但是,我们都知道,在前端做同步读取显然不是好的实践做法,毕竟JavaScript的很多良好体验都是通过异步请求实现的。而且,同步之后会严重影响前端的体验和性能。所以,这里把标题写成“同步读取服务器数据”,更多是吸引眼球。希望刚刚你不是拿着砖头正准备拍的!
不过,我在网上搜索了一下,还真有人一开始和我想法一样的,见参考资料2。转入正题。
AngularJS提供了一个内置Service $q,它提供了一种承诺/延后(promise/deferred),可以保证我们的调用代码一定能够拿到数据。当然,我们可以猜到,最后去服务器取数据的方式肯定是异步的。只不过这个服务提供了表面上是同步访问的API,当数据获取成功之后,自动将数据提供给调用的代码。
$q – A promise/deferred implementation inspired by Kris Kowal’s Q.
The CommonJS Promise proposal describes a promise as an interface for interacting with an object that represents the result of an action that is performed asynchronously, and may or may not be finished at any given point in time.
话不多说,上代码看看:
1. 创建一个Service,去服务器读取数据:
- // $q 是内置服务,所以可以直接使用
- ngApp.factory('UserInfo', ['$http', '$q', function ($http, $q) {
- return {
- query : function() {
- var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行
- $http({method: 'GET', url: 'scripts/mine.json'}).
- success(function(data, status, headers, config) {
- deferred.resolve(data); // 声明执行成功,即http请求数据成功,可以返回数据了
- }).
- error(function(data, status, headers, config) {
- deferred.reject(data); // 声明执行失败,即服务器返回错误
- });
- return deferred.promise; // 返回承诺,这里并不是最终数据,而是访问最终数据的API
- } // end query
- };
- }]);
2. 在Controller上(以同步方式)使用这个Service:
- angular.module('ngApp')
- .controller('MainCtrl', ['$scope', 'UserInfo', function ($scope, UserInfo) { // 引用我们定义的UserInfo服务
- var promise = UserInfo.query(); // 同步调用,获得承诺接口
- promise.then(function(data) { // 调用承诺API获取数据 .resolve
- $scope.user = data;
- }, function(data) { // 处理错误 .reject
- $scope.user = {error: '用户不存在!'};
- });
- }]);
欢迎讨论和交流AngularJS及前端开发。
参考资料:
1. ng.$q API文档:http://docs.angularjs.org/api/ng.$q
2. http://stackoverflow.com/questions/17731942/how-to-load-data-synchronously-in-angularjs-application
- 在AngularJS中使用$q同步读取服务器数据
- 在AngularJS中使用$q同步读取服务器数据
- 在AngularJS中使用$q同步读取服务器数据
- 在ionic中使用$q同步读取sqlite3记录
- AngularJS中使用service,并同步数据
- angularJs使用$q服务进行同步请求数据,解决异步获取数据导致return返回为空的问题
- angularjs学习之路---使用$q进行“同步”编程
- angularjs中$q详解
- angularjs中$q详解
- angularJS中利用promise,$q进行ajax数据定向缓存
- 在jsp文件中读取本地SQL服务器中的数据。
- 在项目中使用PowerBuilder来同步数据数据。
- AngularJS $q学习:轮询图表数据
- 在Android中使用SyncAdapter同步数据全攻略
- Http之客户端请求服务器,服务器响应客户端。通过Handler在主线程中读取数据
- angularJs中ng-model-options设置数据同步
- 在NDK中使用libpng读取pixel数据
- 在NDK中使用libpng读取pixel数据
- 圆角和圆形image
- jQuery操作input
- Linux Shell介绍
- 线性布局LinearLayout
- linux压缩与解压缩 tar命令
- 在AngularJS中使用$q同步读取服务器数据
- QT连接Oracle数据库
- 阿里巴巴分布式框架
- SGU帐号
- 打印调试信息的总结 pr_dbug pr_err pr_info
- linux centos 利用scp 和sftp 上传下载文件
- java字节数组和16进制之间的转换
- linux下如何查询未知库所依赖的包
- 浅谈chromium中的指针管理