有时我使用$ http服务获取数据时遇到问题。而且我没有100%理解.success()和.then()
之间的主要区别以下是我可以使用$ http()。then()获取数据的示例,但我无法使用$ http()。success()获取数据。任何人都可以解释原因吗?
使用$ http.success()http://jsfiddle.net/xoonpLte/11/
的代码var manuRep = angular.module('manuRep', ['ui.bootstrap']);
manuRep.controller('MyAppController', function($scope, $http) {
$http.get('https://dl.dropboxusercontent.com/u/59954187/jobs.json').
success(function(response) {
$scope.cats = response.data;
}).
error(function(error){
alert(JSON.stringify(error));
return error;
});
});
使用$ http.then()http://jsfiddle.net/xoonpLte/12/
的代码var manuRep = angular.module('manuRep', ['ui.bootstrap']);
manuRep.controller('MyAppController', function($scope, $http) {
$http.get('https://dl.dropboxusercontent.com/u/59954187/jobs.json').
then(function(response) {
$scope.cats = response.data;
});
});
答案 0 :(得分:4)
.then
是承诺
.success
和.error
是回调。
为什么回调或承诺?
1。承诺可以处理全球错误 2。 Promise可以链接(你没有像回调这样的封装)
P =承诺,
R =响应,
E =错误。
<强> 1 强>
P1(R1)
.P2(R2)
.P3(R3, E3)
如果承诺1,2或3中存在错误,将调用错误3 回调无法做到这一点。
<强> 2 强>
如果你有3个承诺:
P1(R1, E1)
.P2(R2, E2)
.P3(R3,E3)
如果你有3个回调
P1().success(P2().success(P3().success().error()).error()).error()
修改强>
.service('Auth', function(){
this.isLoggedIn = function(){
return $http.get('url/isLoggedIn');
};
})
.service('getData', function(){
this.name = function(){
return $http.get('url/data/name');
}
})
.controller('MyCTRL', ['Auth', 'getData', function(auth, getData){
Auth.isLoggedIn().then(function(resp){
return getData.name(); //By sending a value back inthe response, next response is called
})
.then(function(res){
//Here we are
}, function(err){
//Global error.
//This will be called in P1 or P2
})
}]);
答案 1 :(得分:1)
其他答案涉及success
仅收到数据的方式,但then
没有。然而,其含义远不止于此:
$http()
(或其任何快捷方法)将返回已扩充其原型的承诺。原型获得success
和error
方法。这两种方法本质上更像回调而不是其他任何东西;在调用success
并传递回调时,将返回原始承诺,这与承诺的相似性结束。
success
/ error
无法链接。也就是说,当您在promise中返回then
的值时,它将被传递给then
的下一次调用。从这个意义上讲,承诺可以被束缚。此外,在then
中返回promise将解析该promise,然后将已解析的值传递给下一个then
调用。
success
/ error
不能这样做,而是用于引入副作用。从这些函数返回的任何值都将被丢弃。它们也不会收到原始的http响应,而只是来自端点的数据。多个success
/ error
来电将设置独立的回调。此外,没有办法“等待”成功/错误回调已完成执行。因此,如果成功/错误回调触发异步事件,Q.all()
将不会对成功/错误回调起作用。
因此,我建议您仅使用then
/ catch
代替success/error
。这允许您与处理promise的其他框架保持兼容,并且还允许您链接promises以进一步操作数据。它还可以帮助你预防副作用,每个人都喜欢防止副作用!