Page 191 - AngularJS权威教程
P. 191

17.3  Angular 中的 promise   171


                  var deferred = $q.defer();
                                                                                                     1
                  deferred对象暴露了三个方法,以及一个可以用于处理promise的promise属性。

                   resolve(value)                                                                   2
                  resolve函数用这个值来执行deferred promise。
                                                                                                     3
                  deferred.resolve({name: "Ari", username: "@auser"});
                   reject(reason)
                                                                                                     4
                  这个方法用一个原因来拒绝deferred promise。它等同于使用一个“拒绝”来执行一个promise。
                  deferred.reject("Can't update user");                                              5
                  // 等同于
                  deferred.resolve($q.reject("Can't update user"));
                   notify(value)                                                                    6

                  这个方法用promise的执行状态来进行响应。
                                                                                                     7
                  例如,如果我们要从promise返回一个状态,可以使用notify()函数来传送它。

                  假设我们想要从一个promise创建多个长时间运行的请求。可以调用notify函数发回一个过
              程通知:                                                                                   8

                  .factory('GithubService', function($q, $http) {
                      // 从仓库获取事件                                                                     9
                      var getEventsFromRepo = function() {
                          // 任务
                      }                                                                              10
                      var service = {
                          makeMultipleRequests: function(repos) {
                              var d = $q.defer(),                                                    11
                                  percentComplete = 0,
                                  output = [];
                              for (var i = 0; i < repos.length; i++) {
                                  output.push(getEventsFromRepo(repos[i]));                          12
                                  percentComplete = (i+1)/repos.length * 100;
                                  d.notify(percentComplete);
                              }                                                                      13

                              d.resolve(output);

                              return d.promise;                                                      14
                          }
                      }
                      return service;                                                                15
                  });
                  有了GithubService对象上的这个makeMultipleRequests()函数,每次获取和处理一个仓库
              时,都会收到一个过程通知。                                                                          16
                  可以在我们对promise的使用中用到这个通知,在用promise时加上第三个函数调用。例如:
                                                                                                     17
                  .controller('HomeController',
                      function($scope, GithubService) {
                          GithubService.makeMultipleRequests([                                       18
                              'auser/beehive', 'angular/angular.js'
   186   187   188   189   190   191   192   193   194   195   196