角 Http 承诺: “成功”/“错误”方法与“然后”论证的区别

根据 AngularJS 博士,打往 $http的电话回复如下:

返回一个具有标准 那么方法和两个 http 特定方法的 我保证对象: 成功错误那么方法接受两个参数,一个是 成功,另一个是 错误回调,这两个参数将由一个响应对象调用。成功错误方法只有一个参数——当请求成功或失败时将分别调用该函数。传递给这些函数的参数是传递给 then 方法的响应对象的解构表示。

除了 response对象在一种情况下是解构的这一事实之外,我不知道

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

有吗? 这两种不同的方式传递看似相同的回调有什么意义呢?

115726 次浏览

NB 这个答案事实上是不正确的; 正如下面的评论所指出的,成功确实返回了最初的承诺。我不会改变; 让 OP 来编辑它。


两者之间的主要区别在于,.then()调用返回一个承诺(用回调返回的值解析) ,而 .success()是更传统的注册回调的方式,不返回一个承诺。

基于承诺的回调(.then())使得连锁承诺(做一个调用,解释结果和 那么做另一个调用,解释结果,再做一个调用等)变得容易。

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

简而言之:

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

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

作为补充,下面的代码示例指出了这些差异:

成功错误:

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

这里已经有了一些不错的答案,但是我们有必要把并行性的不同之处说清楚:

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

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

. Success ()和. error ()可以被链接,但是它们都会同时触发(所以这一点没有多大意义)

. Success ()和. error ()只适用于简单的调用(简单的调用者) :

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

正式通知: 成功与失败已被弃用,请改用标准的 then 方法。

折旧通知: $http 遗留承诺方法的成功和错误已被弃用。请改用标准 then 方法。如果 设置为 false 方法将抛出 $http/遗留错误。

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

屏幕截图: 查看屏幕截图