Angular HttpPromise:“成功”/“错误”方法与“then”参数的区别

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

使用标准then方法和两个特定于http的方法返回promise对象: 成功错误then方法接受两个参数成功和一个错误callback,这个callback将被一个响应对象调用。 成功错误方法采用一个参数 – 一个函数,当请求成功或失败时将被调用。 传递给这些函数的参数是传递给then方法的响应对象的解构表示。

除了response对象在一个案例中被解构的事实,我没有区别

  • 那么成功/错误的callback函数将作为promise.thenparameter passing
  • callback函数作为promise的promise.success / promise.error方法的parameter passing

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

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


2之间的主要区别在于.then()调用返回一个promise(使用从callback函数返回的值parsing),而.success()则是传统的注册callback方法,不返回promise。

基于Promise的callback.then().then() )可以很容易地链接promise(做一个调用,解释结果然后再调用,解释结果,再打另一个调用等等)。

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

简而言之:

  • .then() – 诺言API的全部权力,但稍微更详细
  • .success() – 不返回一个承诺,但会产生稍微更加方便的语法

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

  • 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()并行

简单的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 }); 

.then()是可链接的,将等待先前的.then()来parsing。

.success()和.error()可以链接在一起,但是它们都会立即启动(所以没有多less意思)

.success()和.error()对于简单的调用(简单的制作者)来说是很好的:

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

所以你不必input这个:

 $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/

只是为了完成,这是一个代码示例,指出不同之处:

成功\错误:

 $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 }). 

官方通知:成功和错误已被弃用,请使用标准然后方法。

弃用声明:$ http传统promise方法的成功和错误已被弃用。 改为使用标准然后方法。 如果$ httpProvider.useLegacyPromiseExtensions设置为false,那么这些方法将抛出$ http / legacy错误。

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

截图:查看截图