Angular HttpPromise:“成功”/“错误”方法与“then”参数的区别
根据AngularJS doc ,调用$http
返回如下内容:
使用标准then方法和两个特定于http的方法返回promise对象: 成功和错误 。 then方法接受两个参数成功和一个错误callback,这个callback将被一个响应对象调用。 成功和错误方法采用一个参数 – 一个函数,当请求成功或失败时将被调用。 传递给这些函数的参数是传递给then方法的响应对象的解构表示。
除了response
对象在一个案例中被解构的事实,我没有区别
- 那么成功/错误的callback函数将作为
promise.then
parameter 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){/*...*/})
-
$http.get()
-
seqFunc1()
-
seqFunc2()
success()
驱动并行操作,因为处理程序链接在相同的承诺。
$http(/*...*/). success(function parFunc1(data){/*...*/}). success(function parFunc2(data){/*...*/})
-
$http.get()
-
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.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
截图:查看截图