Angularjs promise对象解析

一、先来看一段Demo,看完这个demo你能够思考下若是使用$.ajax如何处理一样的逻辑,使用ng的promise有何优点?

var ngApp=angular.module('ngApp',[]);
			
/*******************************************************************
 * $q为内置服务
****************************************************************/
ngApp.factory('UserInfoService',['$http','$q',function($http,$q){
	return{
	   query:function(){
		var defer=$q.defer();  //声明延后执行
		$http({method:'GET',url:'data/students.json'}).
		success(function(data,status,headers,config){
			defer.resolve(data);  //声明执行成功
			console.log('UserInfoService success');
		}).
		error(function(data,status,headers,config){
			defer.reject();      //声明执行失败
		});
						
		return defer.promise; //返回承诺,返回获取数据的API
		}
		}
	}]);
			
	ngApp.controller('MainCtrl',['$scope','UserInfoService',function($scope,UserInfoService){
	     var promise = UserInfoService.query();  //同步调用,获取承诺接口
		promise.then(function(data){
			$scope.user=data;  //调用承诺接口resolove()
			console.log('MainCtrl ...');
			},function(data){
			  $scope.user={error:'数据不存在。。。'}; //调用承诺接口reject();
			});
				
			}]);

 

二、什么是promise?

      promise是一种用异步的方式处理值的方法,promise是对象,表明了一个函数最终可能的返回值或者抛出的异常,在与远程对象打交道时咱们能够把他看做是远程对象的一个代理。 若是说是promise也是异步处理方式的一种,那么咱们会想起它和XHR和$.ajax有啥区别呢? javascript

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

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

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

回调示例

User.get(fromId,{
    success:function(){
          user.friends.find(toId,function(){})
    },
    failure:function(){} 
})

ng promise示例

User.get(fromId).
   then(function(user){

    },function(err){

}).
   then(function(){},function(){});

  

三、为何使用promise

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

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

  •  只有一个resolve或者reject会被调用到
  •  若是promise被执行或者被拒绝了,依赖于他们的处理程序仍然会被调用
  •  处理程序老是会被异步调用

             

四、如何建立promise

      想要在angularjs中建立promise,能够使用内置的$q服务,$q服务在它的deferred API中提供了一些方法。闭包

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

      

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

   要建立一个deferred对象,能够调用defer()方法; var deferred= $q.defer();函数

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

  • 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的执行或者拒绝,而无需修改结果的值。一般就作一些资源的清理工做。

五、链式请求

      

GitHubService.then(function(data){

}).then(function(data){
    $scope.Users=data;
});
相关文章
相关标签/搜索