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'