179

According to AngularJS doc, calls to $http return the following:

Returns a promise object with the standard then method and two http specific methods: success and error. The then method takes two arguments a success and an error callback which will be called with a response object. The success and error methods take a single argument - a function that will be called when the request succeeds or fails respectively. The arguments passed into these functions are destructured representation of the response object passed into the then method.

Aside from the fact that the response object is destructured in one case, I don't get the difference between

  • the success/error callbacks passed to be passed as arguments of promise.then
  • the callbacks passed as arguments for the promise.success/promise.error methods of the promise

Is there any? What's the point of these two different ways to pass seemingly identical callbacks?

4

6 回答 6

204

这里已经有一些很好的答案。但值得将所提供的并行性差异带回家:

  • success()返回原始承诺
  • then()返回一个新的承诺

不同之处在于then()驱动顺序操作,因为每个调用都返回一个新的承诺。

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
  1. $http.get()
  2. seqFunc1()
  3. seqFunc2()

success()驱动并行操作,因为处理程序链接在同一个承诺上。

$http(/*...*/).
  success(function parFunc1(data){/*...*/}).
  success(function parFunc2(data){/*...*/})
  1. $http.get()
  2. parFunc1(),parFunc2()并行
于 2014-05-22T11:43:31.753 回答
157

注意这个答案实际上是不正确的;正如下面的评论所指出的,success() 确实返回了原始承诺。 我不会改变;并将其留给 OP 进行编辑。


2 之间的主要区别在于.then()call 返回一个 promise(通过回调返回的值解析),而.success()它是注册回调的更传统方式并且不返回 promise。

基于.then()Promise的回调(

.success()当您不需要链接调用或使用 Promise API(例如,在路由中)时,该方法是一种简化的便捷方法。

简而言之:

  • .then()- Promise API 的全部功能,但略显冗长
  • .success()- 不返回承诺,但提供更方便的语法
于 2013-05-05T14:08:21.387 回答
114

一些简单 GET 请求的代码示例。也许这有助于理解差异。使用then

$http.get('/someURL').then(function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // success handler
}, function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // error handler
});

使用success/ error

$http.get('/someURL').success(function(data, status, header, config) {
    // success handler
}).error(function(data, status, header, config) {
    // error handler
});
于 2013-05-05T17:37:20.913 回答
27

.then() 是可链接的,将等待前一个 .then() 解决。

.success() 和 .error() 可以链接起来,但它们会同时触发(所以没有太多的意义)

.success() 和 .error() 非常适合简单的调用(easy maker):

$http.post('/getUser').success(function(user){ 
   ... 
})

所以你不必输入这个:

$http.post('getUser').then(function(response){
  var user = response.data;
})

但通常我用 .catch() 处理所有错误:

$http.get(...)
    .then(function(response){ 
      // successHandler
      // do some stuff
      return $http.get('/somethingelse') // get more data
    })
    .then(anotherSuccessHandler)
    .catch(errorHandler)

如果您需要支持 <= IE8,请像这样编写 .catch() 和 .finally() (IE 中的保留方法):

    .then(successHandler)
    ['catch'](errorHandler)

工作示例:

这是我以更代码格式编写的内容,以刷新我对处理错误等如何发挥作用的记忆:

http://jsfiddle.net/nalberg/v95tekz2/

于 2014-12-12T06:06:42.207 回答
17

只是为了完成,这里是一个指示差异的代码示例:

成功\错误:

$http.get('/someURL')
.success(function(data, status, header, config) {
    // success handler
})
.error(function(data, status, header, config) {
    // error handler
});

然后:

$http.get('/someURL')
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
}).
于 2014-04-03T11:17:40.897 回答
3

官方通告:success 和 error 已被弃用,请改用标准 then 方法。

弃用通知:不推荐使用 $http 遗留承诺方法成功和错误。请改用标准 then 方法。如果 $httpProvider.useLegacyPromiseExtensions 设置为 false,那么这些方法将抛出 $http/legacy 错误。

链接:https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

截图:查看截图

于 2016-08-24T07:04:32.337 回答