Page 190 - AngularJS权威教程
P. 190

170  第 17 章  promise


             17.3  Angular 中的 promise

                 Angular的事件循环给予了Angular特有的能力,能在$rootScope.$evalAsync阶段中执行
             promise(关于运行循环的更多细节,参见第24章)。promise会坐等$digest运行循环结束。

                 这件事让我们能毫无压力地把promise的结果转换到视图上。它也能让我们不加思考地把
             XHR调用的结果直接赋值到$scope对象的属性上。
                 我们来建一个例子,从GitHub上返回一组针对AngularJS的开放pull请求。

                         ①
                 来玩玩吧 。
                 <h1>Open Pull Requests for Angular JS</h1>

                 <ul ng-controller="DashboardController">
                   <li ng-repeat="pr in pullRequests">
                     {{ pr.title }}
                   </li>
                 </ul>
                 如果有个服务返回了一个promise(第19章会深入探讨),可以在.then()方法中与这个
             promise交互,它允许我们修改作用域上的任意变量,放置到视图上,并且期望Angular会为我
             们执行它:

                 angular.module('myApp', [])
                 .controller('DashboardController', [
                     '$scope', 'GithubService',
                         function($scope, UserService) {
                             // GithubService的getPullRequests()方法
                             // 返回了一个promise
                             User.getPullRequests(123)
                              .then(function(data) {
                                 $scope.pullRequests = data.data;
                         });
                 }]);

                 当对 getPullRequests 的 异步调用返 回时,在 .then() 方 法中就可以用 $scope.pull
             Requests这个值了,然后它会更新$scope.pullRequests数组。


             如何创建一个 promise

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

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

                 angular.module('myApp', [])
                   .factory('GithubService', ['$q', function($q) {
                   // 现在就可以访问到$q库了
                 }]);
                 要创建一个deferred对象,可以调用defer()方法:

             ——————————
                ① http://jsbin.com/UfotanA/4/edit
   185   186   187   188   189   190   191   192   193   194   195