Page 193 - AngularJS权威教程
P. 193

17.4  链式请求   173


                  $http.get('/repos/angular/angular.js/pulls')                                       1
                  .catch(function(reason) {
                          deferred.reject(reason);
                  });
                                                                                                     2
                   finally(callback)
                  finally方法允许我们观察promise的履行或者拒绝,而无需修改结果的值。当我们需要释放                                    3
              一个资源,或者是运行一些清理工作,不管promise是成功还是失败时,这个方法会很有用。

                  我们不能直接调用这个方法,因为finally是IE中JavaScript的一个保留字。纠结到最后,只                                 4
              好这样调用它了:
                  promise['finally'](function() {});                                                 5

                  Angular的$q deferred对象是可以串成链的,这样即使是then,返回的也是一个promise。这
              个promise一被执行,then返回的promise就已经是resolved或者rejected的了。                                   6



                          这些promise也就是Angular能支持$http拦截器的原因。                                         7

                  $q服务类似于原始的Kris Kowal的Q库:
                                                                                                     8
                  (1) $q是跟Angular的$rootScope模型集成的,所以在Angular中,执行和拒绝都很快。

                  (2) $q promise是跟Angular模板引擎集成的,这意味着在视图中找到的任何promise都会在视                            9
              图中被执行或者拒绝。

                  (3) $q很小,所以没有包含Q库的完整功能。                                                            10


              17.4 链式请求                                                                              11


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

                   // 一个响应promise的服务
                   GithubService.then(function(data) {                                               13
                       var events = [];
                       for (var i = 0; i < data.length; i++) {
                           events.push(data[i].events);                                              14
                       }
                       return events;
                   }).then(function(events) {
                       $scope.events = events;                                                       15
                  });

                  在本例中,我们可以创建一个执行链,它允许我们中断基于更多功能的应用流程,可以籍此                                           16
              导向不同的结果。这个中断能让我们在执行链的任意时刻暂停或者推迟promise的执行。

                                                                                                     17
                          这个中断也是$http服务实现请求和响应拦截器的方式。
                                                                                                     18
                  $q库自带了几个不同的有用方法。
   188   189   190   191   192   193   194   195   196   197   198