AngularJS之$promise

什么是promise

promise是一种用异步方式处理值(或者非值)的方法。promise是对象,代表一个函数最终可能的返回值或者抛出的异常。在与远程对象打交道的时候,promise会非常有用,可以把它们看作远程对象的一个代理。

为什么使用promise

使用promise的附带收获之一就是逃脱了回调地狱。promise让异步函数看上去像同步的。基于同步函数,我们可以按照预期来捕获返回值和异常值。可以在程序中的任何时候捕捉错误,并且绕过依赖于程序异常的后续代码。因此,使用promise带来的好处目的是:获得功能组合和错误冒泡能力的同时,保持代码异步运行的能力。

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

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

resolve被调用时,带有一个履行值;

reject被调用时要带一个拒绝原因。

如果promise被执行或者拒绝时,依赖于它们的所有的处理程序仍然会被调用;

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

此外,可以把promise对象串起来,并且允许代码以通常运行的方式来处理。从一个promise冒出的异常会贯穿整个promise链。

promise问题异步执行的,可以放心使用,无需担心它们会阻塞应用的其他部分。

如何创建一个promise

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

首先,要把$q服务注入到想要使用它的对象中。

angular.module('myApp', [])
.factory('GithubService', ['$q', function($q){
  //...
}]);
要创建一个deferred对象,可以调用defer()方法:var deferred = $q.defer()

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

resolve(value)

resolve这个函数用这个值来执行deferred promise.

reject(reason)

这个方法用一个原因来拒绝deferred promise。它等同于使用一个“拒绝”来执行一个promise。

deferred.reject("Can't update user"); //等同于deferred.resolve($q.reject("Can't update user"))

notify(value)

这个方法用promise的执行状态来进行响应。

.factory('GithubService', [
      '$q', '$http',
        function($q, $http) {
          var getPullRequests = function() {
            var deferred = $q.defer();
            // Get list of open angular js pull requests from github
            $http.get('https://api.github.com/repos/angular/angular.js/pulls')
            .success(function(data) {
              deferred.resolve(data);
            })
            .error(function(reason) {
              deferred.reject(reason);
            })
            return deferred.promise;
          }

          return {
            getPullRequests: getPullRequests
          };
    }]);

在上面的service实例中,可以两种不同的方式同promise交互。

         Then(successFn,errorFn, notifyFn)

无论promise是成功不是失败了,当结果可用之后,hten都会立刻异步调用successFn或者errorFn。这个方法始终用一个参数来调用回调函数:结果或是拒绝的理由。

Then()方法总是返回一个新的promise,可以通过successFn或者errorFn这样的返回值执行或者被拒绝。它也通过notifyFn提供通知。

         Catch(errFn)

这个方法只是一个帮助函数,能让我们用.catch(function(reason){})取代errorFn回调:

$http.get(‘url’).catch(function(reason){
         Deferred.reject(reason);
})
         Finally(callback)

Finally方法允许我们观察promise的履行或者拒绝,而无需修改结果的值。当我们需要释放一个资源,或者是运行一些清理工作,不管promise是成功还是失败时,这个方法会

很有用。不能直接调用这个方法,因为finally是IE中JavaScript的一个保留字,只好这样调用它:

Promise[‘finally’](function(){})

链式请求

then方法在初始promise被执行之后,返回一个新的派生promise。这种形式给了我们一种特有的能力,把另一个then接在原始的then方法结果之后。

GithubService.then(function(data){

 var events = [];
     for(var i=0; i<data.length; i++){
       events.push(data[i].events);
     }
     return events;
   }).then(function(events){
     $scope.events = events;
   })







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值