Page 193 - AngularJS权威教程
P. 193
17.4 链式请求 173
$http.get('/repos/angular/angular.js/pulls') 1
.catch(function(reason) {
deferred.reject(reason);
});
2
finally(callback)
finally方法允许我们观察promise的履行或者拒绝,而无需修改结果的值。当我们需要释放 3
一个资源,或者是运行一些清理工作,不管promise是成功还是失败时,这个方法会很有用。
我们不能直接调用这个方法,因为finally是IE中JavaScript的一个保留字。纠结到最后,只 4
好这样调用它了:
promise['finally'](function() {}); 5
Angular的$q deferred对象是可以串成链的,这样即使是then,返回的也是一个promise。这
个promise一被执行,then返回的promise就已经是resolved或者rejected的了。 6
这些promise也就是Angular能支持$http拦截器的原因。 7
$q服务类似于原始的Kris Kowal的Q库:
8
(1) $q是跟Angular的$rootScope模型集成的,所以在Angular中,执行和拒绝都很快。
(2) $q promise是跟Angular模板引擎集成的,这意味着在视图中找到的任何promise都会在视 9
图中被执行或者拒绝。
(3) $q很小,所以没有包含Q库的完整功能。 10
17.4 链式请求 11
then方法在初始promise被执行之后,返回一个新的派生promise。这种返回形式给了我们一
种特有的能力,把另一个then接在初始的then方法结果之后。 12
// 一个响应promise的服务
GithubService.then(function(data) { 13
var events = [];
for (var i = 0; i < data.length; i++) {
events.push(data[i].events); 14
}
return events;
}).then(function(events) {
$scope.events = events; 15
});
在本例中,我们可以创建一个执行链,它允许我们中断基于更多功能的应用流程,可以籍此 16
导向不同的结果。这个中断能让我们在执行链的任意时刻暂停或者推迟promise的执行。
17
这个中断也是$http服务实现请求和响应拦截器的方式。
18
$q库自带了几个不同的有用方法。