promise对象,以及其在Angular中的使用
2016-10-16 22:15
519 查看
promise一种处理异步编程的模式,可以有效解决回调的繁琐,并以一种同步的方式去处理业务流程,同时,允许在回调中采用链式的写法,处理的代码更加优雅。
想要在Angular中创建一个
promise对象,必须在模板中先注入
$q服务,并先调用
defer方法创建一个延期对象:
angular.module('myapp',[]) .controller('myController',['$scope','$q',function($scope,$q){ var defer=$q.defer(); }])
其中,
defer是一个延期对象,它包括三个方法:
notify resolve reject,以及一个名为
promise的属性。
在这3个方法中,都可以通过value参数进行传值,当调用延期对象的
promise属性时,就创建了一个
promise对象。
一旦创建了
promise对象,就可以通过调用
then的方法来执行延期对象不同操作后的回调函数:
promise.then(successCallback,errorCallback,notifyCallback)
5.1 promise
对象的创建使用
<div ng-controller='myController'> <div> <div>{{t0}}</div> <div>{{t1}}</div> <button ng-click='action(true)'>解决</button> <button ng-click='action(false)'>拒绝</button> </div> </div> <script type="text/javascript"> angular.module('myapp',[]) .controller('myController',['$scope','$q',function($scope,$q){ var defer=$q.defer(); $scope.action=function(type){ defer.notify(0); type?defer.resolve(1):defer.reject(1); } var promise=defer.promise; promise.then(function(n){ n++; $scope.t1='已处理完成:'+n; },function(n){ n++; $scope.t1='未完成原因:'+n; },function(n){ n++; $scope.t0='正在处理中:'+n; }) }]) </script>
值得注意的是,无论是调用
resolve还是
reject,都需要首先调用
notify。
此外,在
$q中,还有一个
all方法,该方法的功能是返回一个新的
promise对象,方法的参数是一个
promise数组,当数组中所有的
defer都解决时,才会饭一个解决后的
promise对象,否则,只要有一个defer对象调用了
reject,那么,返回对象也将调用
reject方法。
5.2 promise
在$Http
中的应用
<div ng-controller='myController'> <div> {{result}} </div> </div> <script type="text/javascript"> angular.module('myapp',[]) .factory('async',['$q','$http',function($q,$http){ var defer=$q.defer(); $http.get('/async') .then(function(data){ defer.resolve(data); },function(reason){ defer.reject(reason); }); return defer.promise; }]) .controller('myController',['$scope','async',function($scope,async){ var promise=async; promise.then(function(resp){ $scope.result='请求成功:'+resp.data; },function(resp){ $scope.result='请求成功:'+resp; }) }]) </script>
对应的服务器端代码(Express):
app.get('/async',function(req,res){ res.send('今天天气不错。'); });
相关文章推荐
- 使用单独的命令处理类来处理命令消息(适用于有很多命令处理函数的对象,以及共享命令处理函数)
- 使用SPFolderCollection以及SPFolder对象分层次显示文档列表
- 使用XStream将对象序列化到XML以及从XML反序列化到对象
- NBear.Mapping使用教程(5):实体对象与NameValueCollection,Dicitonary以及NBear.Mapping性能
- Ruby之旅(二) Ruby的基本语法以及对象的使用,方法的定义及调用,属性的定义及使用
- 还原Wss3.0内容数据库时遇到:"ComputerName\Microsoft##SSEE 上的 WSS_Content 包含用户定义的架构。数据库在能够使用之前必须为空。请删除所有表、存储过程以及其他对象,或使用其他数据库。 " 的提示,无法加载内容数据库
- 使用SPFolderCollection以及SPFolder对象分层次显示文档列表(转)
- 使用单独的命令处理类来处理命令消息(适用于有很多命令处理函数的对象,以及共享命令处理函数)
- Server对象有那些属性方法以及怎样使用
- Server对象有那些属性方法以及怎样使用
- java.io 流的几个对象以及方法属性的使用
- 仿MFC实现c++按名动态创建对象之续(瘦身以及解决其在dll中使用的问题)
- [Symbian开发日志三] CAknProgressDialog类的使用以及活动对象的一瞥
- SharePoint中使用SPFolderCollection以及SPFolder对象分层次显示文档列表
- 浅谈类和对象以及对象的使用
- 关于JSON对象,以及联合数组,eval函数的使用参考
- 对象析构谈——delete原语以及delete this的使用及注意事项
- 类于内联函数,外联函数,运算符重载以及类对象的使用
- socket使用代理连接以及传输对象
- 转载,关于在Javascript里自定义对象以及使用案例。