Angular HttpPromise:`success` /`error`方法和`then`参数之间的区别

ejo*_*aud 177 promise angularjs

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

使用标准then方法和两个http特定方法返回promise对象:successerror.所述然后方法有两个参数一成功以及错误回调将与响应对象被调用.的成功错误的方法采取一个参数-一当请求成功或失败分别将被调用的函数.传递给这些函数的参数是传递给then方法的响应对象的析构表示.

除了response在一种情况下对象被解构的事实之外,我没有区别

  • 传递的成功/错误回调作为参数传递 promise.then
  • 回调作为promise 的promise.success/ promise.error方法的参数传递

有没有?这两种不同方式通过看似相同的回调有什么意义?

eve*_*_jr 204

这里有一些很好的答案.但是,将并行性的差异推向家庭是值得的:

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

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

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
Run Code Online (Sandbox Code Playgroud)
  1. $http.get()
  2. seqFunc1()
  3. seqFunc2()

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

$http(/*...*/).
  success(function parFunc1(data){/*...*/}).
  success(function parFunc2(data){/*...*/})
Run Code Online (Sandbox Code Playgroud)
  1. $http.get()
  2. parFunc1(),parFunc2()并行

  • 注意一旦达到`then`就返回新的promise响应,导致`success`和`error`方法消失.另外,对于http错误响应(例如404),`http.then(ok,err).then(ok,err)`中的第一个`then`将传递给`err`处理程序,但是下面的那些将传递给`好的处理程序.基本上``http.success().error().success().error()`是可链接的但是$ q promises是完全不同的,因为它们都是关于特定处理的承诺和顺序(而不是http请求处理) .在我仔细观察之前,我很难理解这一点. (3认同)
  • @Derek第二个`success`将在第一个执行之后执行但在从它返回的任何promise之前解决,而第二个`then`将等待.如果你没有回复承诺,那么两者的行为都是一样的. (2认同)

pko*_*rce 156

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


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

基于Promise的回调(.then())可以轻松链接承诺(进行调用,解释结果然后再进行一次调用,解释结果,再做一次调用等).

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

简而言之:

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

  • 另一个很大的区别是`then`回调只需要一个参数 - 响应 - 而`success`和`error`将响应的各个组成部分作为参数--`data`,`status`,`header`,和`config`. (44认同)
  • 虽然文档没有明确说明,但我们可以推断`.success()`方法返回原始的$ http promise对象,作为链`$ http(...).success(...).error (...)`是可能的.如果看似合理的话,反向`$ http(...).error(...).success(...)`也是可能的,那么`.error()`也应该返回原始的promise对象.`.then()`的区别在于它返回一个*new*promise. (44认同)
  • 请注意,"success"已被弃用.来自https://docs.angularjs.org/api/ng/service/$http#deprecation-notice` $ http遗留承诺方法成功和错误已被弃用.请改用标准方法.如果$ httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$ http/legacy错误. (6认同)
  • 来自$ http服务的angular.js的源代码:`promise.success = function(fn){promise.then(function(response){fn(response.data,response.status,response.headers,config);}); 回报承诺; };` (2认同)

The*_*ppo 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
});
Run Code Online (Sandbox Code Playgroud)

使用success/ error:

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

  • 我个人喜欢简短的代码示例,我在这里发布了它们.Angular文档有时会错过简短的例子. (39认同)
  • 谢谢,但问题更多的是关于这些函数的作用有何不同,或者如果它们做同样的事情,它们都存在的原因.从文档中可以理解如何使用它们的不同之处. (5认同)
  • 重要的是要强调一个事实,第一个要点的响应对象包含第二个要点的“数据,状态,标题和配置”。这意味着响应对象具有一个深度层次。 (2认同)

naw*_*rgs 27

.then()是可链接的,将等待之前的.then()来解决.

.success()和.error()可以链接,但它们都会立刻触发(所以没那么多)

.success()和.error()非常适合简单的调用(简单的制作者):

$http.post('/getUser').success(function(user){ 
   ... 
})
Run Code Online (Sandbox Code Playgroud)

所以你不必输入这个:

$http.post('getUser').then(function(response){
  var user = response.data;
})
Run Code Online (Sandbox Code Playgroud)

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

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

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

    .then(successHandler)
    ['catch'](errorHandler)
Run Code Online (Sandbox Code Playgroud)

工作实例:

这是我用更多的编码格式编写的内容,用于刷新我的内存,了解它如何处理错误等:

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


Mic*_*lLo 17

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

成功\错误:

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

然后:

$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
}).
Run Code Online (Sandbox Code Playgroud)

  • 这个想法是"then"方法更有用,因为你可以更容易地一个接一个地写异步操作. (4认同)