Page 192 - AngularJS权威教程
P. 192

172  第 17 章  promise


                         ])
                         .then(function(result) {
                             // 处理结果
                         }, function(err) {
                             // 发生错误了
                         }, function(percentComplete) {
                             $scope.progress = percentComplete;
                         });
                 });
                 可以在deferred对象上以属性的方式访问promise:

                 deferred.promise
                 上面这个例子完整地展示了如何创建一个函数用于响应promise,看上去可能类似于下面这
             些GithubService上的方法。

                 angular.module('myApp', [])
                     .factory('GithubService', [
                         '$q', '$http',
                         function($q, $http) {
                             var getPullRequests = function() {
                                 var deferred = $q.defer();
                                 // 从Github获取打开的angularjs pull请求列表
                                 $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
                             };
                 }]);
                 现在我们就可以用promise API来跟getPullRequests() promise交互。

                 查看完整示例:http://jsbin.com/rukefimu/3/edit。
                 在上面这个service的实例中,可以用两种不同方式跟promise交互。

                  then(successFn, errFn, notifyFn)

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

                 在promise被执行或者拒绝之前,notifyFn回调可能会被调用0到多次,以提供过程状态的
             提示。
                 then()方法总是返回一个新的promise,可以通过successFn或者errFn这样的返回值执行或
             者被拒绝。它也能通过notifyFn提供通知。

                  catch(errFn)
                 这个方法就只是个帮助函数,能让我们用.catch(function(reason){})取代err回调:
   187   188   189   190   191   192   193   194   195   196   197