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回调: