.success()和.then()之间的Angular $ http差异

时间:2015-07-14 13:49:03

标签: angularjs

有时我使用$ 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;    
      });
  });

2 个答案:

答案 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()(或其任何快捷方法)将返回已扩充其原型的承诺。原型获得successerror方法。这两种方法本质上更像回调而不是其他任何东西;在调用success并传递回调时,将返回原始承诺,这与承诺的相似性结束。

success / error无法链接。也就是说,当您在promise中返回then的值时,它将被传递给then的下一次调用。从这个意义上讲,承诺可以被束缚。此外,在then中返回promise将解析该promise,然后将已解析的值传递给下一个then调用。

success / error不能这样做,而是用于引入副作用。从这些函数返回的任何值都将被丢弃。它们也不会收到原始的http响应,而只是来自端点的数据。多个success / error来电将设置独立的回调。此外,没有办法“等待”成功/错误回调已完成执行。因此,如果成功/错误回调触发异步事件,Q.all()将不会对成功/错误回调起作用。

因此,我建议您仅使用then / catch代替success/error。这允许您与处理promise的其他框架保持兼容,并且还允许您链接promises以进一步操作数据。它还可以帮助你预防副作用,每个人都喜欢防止副作用!