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