Angularjs promise对象解析

习惯上js使用闭包或者回调来相应非同步返回的数据,比如页面加载之后的XHR请求。我们可以跟数据进行正常交互,就好像它已经返回了一样,而不需要依赖回调函数的触发。

那么ng提出的promise是为了解决什么问题呢? 回调已经被使用了很长时间,通常如果有回调依赖其他还回调时将会时调试变得非常艰难,每一步调用之后都需要显示处理错误。与之不同的是promise提供了另外一个抽象:这些函数返回promise对象。

从一定层面上看ng改变的不是简单的改变代码风格,而是让我对一些思维习惯发起了反思和改善。

回调示例
1
2
3
4
5
6
User.get(fromId,{
     success: function (){
           user.friends.find(toId, function (){})
     },
     failure: function (){}
})
ng promise示例
1
2
3
4
5
6
7
User.get(fromId).
    then( function (user){
 
     }, function (err){
 
}).
    then( function (){}, function (){});

3、为什么使用promise

使用了promise的收获之一是逃脱了回调的固定思维逻辑。promise让异步处理的机制看上去更像是同步,基于同步函数我们可以按照预期来捕获返回值和异常值。可以在程序中的任何时刻捕捉错误,并且绕过依赖于程序异常的后续代码,我们不需要思考这个同步带来的好处。因此使用promise的目的是:获取功能组合和错误冒泡能力的同时,保持代码异步运行的能力。

promise是头等对象,自带了一些约定。

  • 只有一个resolve或者reject会被调用到

  • 如果promise被执行或者被拒绝了,依赖于他们的处理程序仍然会被调用

  • 处理程序总是会被异步调用

4、如何创建promise

想要在angularjs中创建promise,可以使用内置的 q 服务, q服务, q服务,q服务在它的deferred API中提供了一些方法。

首先把它注入到你想使用它的对象中

1
2
3
4
angular.module( 'ngApp' ,[]).
factory( 'UserInfoService' ,[ '$q' , function ($q){
     //code here
}])

要创建一个deferred对象,可以调用defer()方法; var deferred= $q.defer();

deferred对象暴露了三个方法,以及一个可以用于处理promise的promise属性。

  • resolve(value)。 deferred.resolve({name:“Kobe”,Age:36});

  • reject(reason)。 deferred.reject(“Can’t update user”);

  • notify(value)。这个方法用promise的执行状态进行响应。

  • then(successFn,errFn,notifyFn)。

  • catch(errFn)。

  • finally(callback)。finally允许我们观察promise的执行或者拒绝,而无需修改结果的值。通常就做一些资源的清理工作。

5、链式请求

1
2
3
4
5
GitHubService.then( function (data){
 
}).then( function (data){
     $scope.Users=data;
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值