Page 146 - AngularJS权威教程
P. 146
126 第 15 章 同外界通信:XHR 和服务器通信
var promise = $http({
method: 'GET',
url: '/api/users.json'
});
由于$http方法返回一个promise对象,我们可以在响应返回时用then方法来处理回调。如果
使用then方法,会得到一个特殊的参数,它代表了相应对象的成功或失败信息,还可以接受两个
可选的函数作为参数。或者可以使用success和error回调代替。
promise.then(function(resp){
// resp是一个响应对象
}, function(resp) {
// 带有错误信息的resp
});
// 或者使用success/error方法
promise.success(function(data, status, headers, config){
// 处理成功的响应
});
// 错误处理
promise.error(function(data, status, headers, config){
// 处理非成功的响应
});
如果响应状态码在200和299之间,会认为响应是成功的, success回调会被调用,否则error
回调会被调用。
注意,如果响应结果是重定向,XMLHttpRequest会跟进这个重定向,error回
调并不会被调用。
我们可以调用HttpPromise对象上的then()、success()和error()方法。then()方法与其
他两种方法的主要区别是,它会接收到完整的响应对象,而success()和error()则会对响应对
象进行析构。
调用http方法后,在下一个$digest循环运行之前它并不会被真正执行。尽管大部分情况下
我们都是在$apply代码快内部使用$http,但也可以在AngularJS的$digest循环以外执行这个
方法。
如果要在AngularJS的$digest循环以外执行$http函数,需要将其封装在一个$apply代码快
中。这样会强制digest循环执行,我们的promise可以按预期那样被resolve。
$scope.$apply(function(){
$http({
method: 'GET',
url: '/api/users.json'
});
});
快捷方法
$http服务提供了一些顺手的快捷方法供我们使用,这些方法简化了复杂设置,只需要提供
URL和HTTP方法(或者POST或PUT请求中包含的数据)即可。
用这些快捷方法,可以将上面$http的GET请求修改成: