Angularjs 角度HttpPromise:'success`/'error`方法和'then`';s的论点

Angularjs 角度HttpPromise:'success`/'error`方法和'then`';s的论点,angularjs,promise,Angularjs,Promise,根据,调用$http返回以下内容: 返回一个带有标准然后方法和两个http特定方法的promise对象:success和error。then方法接受两个参数,一个是success,一个是error回调,该回调将由响应对象调用。success和error方法使用一个参数-当请求成功或失败时分别调用该函数。传入这些函数的参数是传入then方法的响应对象的非结构化表示 除了响应对象在一种情况下被解构这一事实之外,我不知道它们之间的区别 成功/错误回调作为promise的参数传递。然后 回调作为承诺的

根据,调用
$http
返回以下内容:

返回一个带有标准然后方法和两个http特定方法的promise对象:successerrorthen方法接受两个参数,一个是success,一个是error回调,该回调将由响应对象调用。successerror方法使用一个参数-当请求成功或失败时分别调用该函数。传入这些函数的参数是传入then方法的响应对象的非结构化表示

除了
响应
对象在一种情况下被解构这一事实之外,我不知道它们之间的区别

  • 成功/错误回调作为
    promise的参数传递。然后
  • 回调作为承诺的
    promise.success
    /
    promise.error
    方法的参数传递
有吗?这两种不同的方法传递看似相同的回调有什么意义?

NB这个答案事实上是不正确的;正如下面的评论所指出的,success()确实返回了最初的承诺。我不会改变;并将其留给OP编辑


2之间的主要区别在于
.then()
调用返回一个承诺(使用回调返回的值进行解析),而
.success()
是注册回调的更传统的方法,不返回承诺

基于承诺的回调(
.then()
)使链接承诺变得容易(执行一个调用、解释结果,然后执行另一个调用、解释结果、再执行另一个调用等)

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

简言之:

  • .then()
    -promise API的全部功能,但稍显冗长
  • .success()
    -不返回承诺,但提供更方便的语法

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

$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
});
使用
成功
/
错误

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

下面是一个代码示例,用于说明差异:

成功\错误:

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


这里已经有了一些很好的答案。但值得一提的是,在并行性方面存在差异:

  • success()
    返回原始承诺
  • then()
    返回一个新的承诺
区别在于
then()
驱动顺序操作,因为每个调用都返回一个新的承诺

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
  • $http.get()
  • seqFunc1()
  • seqFunc2()
  • success()

    $http(/*...*/).
      success(function parFunc1(data){/*...*/}).
      success(function parFunc2(data){/*...*/})
    
  • $http.get()
  • parFunc1()
    parFunc2()
    并行
  • .then()是可链接的,将等待上一个.then()解析

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

    .success()和.error()仅适用于简单调用(easy makers):

    因此,您不必键入以下内容:

    $http.post('getUser').then(function(response){
      var user = response.data;
    })
    
    但通常我使用.catch()处理所有错误:


    如果您需要支持,请使用标准then方法。

    弃用通知书: $http legacy promise方法success和error已被弃用。改用标准then方法。如果 $httpProvider.useLegacyPromiseExtensions设置为false,则这些 方法将抛出$http/legacy错误


    另一个很大的区别是,
    then
    回调只接受一个参数--response--
    success
    error
    将响应的各个组件作为参数--
    data
    status
    header
    config
    @BrandonTilley完全正确,但是问题的作者已经解决了这个问题,所以我不想在这里重复。虽然文档没有明确说明,但我们可以推断
    .success()
    方法返回原始的$http promise对象,因为链
    $http(…).success(…).error(…)
    是可能的。如果逆
    $http(…).error(…).success(…)
    也是可能的,那么
    .error()
    也应该返回原始的promise对象。
    .then()
    的区别在于它返回一个新的承诺。源代码来自$http服务的angular.js:
    promise.success=function(fn){promise.then(function(response){fn(response.data,response.status,response.headers,config);});返回承诺;}请注意,
    success
    已被弃用。在
    中,$http legacy promise方法success和error已被弃用。改用标准then方法。如果$httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$http/legacy错误。
    谢谢,但问题更多的是这些函数的作用不同,或者如果它们做相同的事情,它们都存在的原因。如何使用它们的区别可以从文档中理解。我个人喜欢简短的代码示例,这就是我在这里发布它们的原因。有角度的文档有时会漏掉简短而精确的示例。重要的是要强调这样一个事实:第一个gist的respond对象包含第二个gist的“data、status、heade和config”。这意味着响应对象有一个级别的ad
    $http.post('/getUser').success(function(user){ 
       ... 
    })
    
    $http.post('getUser').then(function(response){
      var user = response.data;
    })
    
    $http.get(...)
        .then(function(response){ 
          // successHandler
          // do some stuff
          return $http.get('/somethingelse') // get more data
        })
        .then(anotherSuccessHandler)
        .catch(errorHandler)
    
        .then(successHandler)
        ['catch'](errorHandler)