AngularJS doc 에 따르면 $http
다음 을 반환하기 위해 호출합니다 .
표준 then 메소드와 두 개의 http 특정 메소드 ( success 및 error)를 가진 promise 객체를 리턴합니다 . 다음 방법은 두 개의 인수 소요 성공 과 오류 응답 객체로 호출 될 콜백을. 성공 및 오류 요청이 성공하거나 각각 실패 할 때 호출되는 함수 – 방법은 하나의 인수를. 이 함수에 전달 된 인수는 then 메소드에 전달 된 응답 객체의 구조화 된 표현입니다.
어떤 경우에는 response
객체가 구조화 되었다는 사실을 제외하고 는 차이점이 없습니다.
- 성공 / 오류 콜백은 다음과 같은 인수로 전달됩니다.
promise.then
- 약속 의
promise.success
/promise.error
메소드에 대한 인수로 전달 된 콜백
있어요? 겉보기에 동일한 콜백을 전달하는이 두 가지 방법의 요점은 무엇입니까?
답변
NB 이 답변은 사실 틀 렸습니다. 아래의 주석에서 지적한 것처럼 success ()는 원래 약속을 반환합니다. 나는 변하지 않을 것이다. 편집하려면 OP로 두십시오.
2의 주요 차이점은 .then()
콜백이 콜백에서 반환 된 값으로 해결 된 약속을 반환하는 반면 .success()
콜백을 등록하는 전통적인 방법이며 약속을 반환하지 않는다는 것입니다.
약속 기반의 콜백 ( .then()
) 체인 약속 (전화를 할 결과를 해석하고 쉽게 그것을 확인 후 등 또 다른 호출을 수행, 결과를 해석, 다른 통화를 할).
이 .success()
방법은 통화를 연결하거나 약속 API와 함께 작업 할 필요가없는 경우 (예 : 라우팅) 간소화되고 편리한 방법입니다.
한마디로 :
.then()
-promise 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 ()이 해결 될 때까지 기다립니다.
.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.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 기존 약속 방법 성공 및 오류는 더 이상 사용되지 않습니다. 대신 표준 then 메소드를 사용하십시오. $ httpProvider.useLegacyPromiseExtensions가 false로 설정된 경우 이러한 메소드는 $ http / legacy 오류를 발생시킵니다.
링크 : https://code.angularjs.org/1.5.7/docs/api/ng/service/$http