Angular HttpPromise : '성공'/ '오류'메소드와 '그런 다음'인수의 차이점


177

AngularJS doc 에 따르면 $http다음 을 반환하기 위해 호출합니다 .

표준 then 메소드와 두 개의 http 특정 메소드 ( successerror)를 가진 promise 객체를 리턴합니다 . 다음 방법은 두 개의 인수 소요 성공오류 응답 객체로 호출 될 콜백을. 성공오류 요청이 성공하거나 각각 실패 할 때 호출되는 함수 - 방법은 하나의 인수를. 이 함수에 전달 된 인수는 then 메소드에 전달 된 응답 객체의 구조화 된 표현입니다.

어떤 경우에는 response객체가 구조화 되었다는 사실을 제외하고 는 차이점이 없습니다.

  • 성공 / 오류 콜백은 다음과 같은 인수로 전달됩니다. promise.then
  • 약속 의 promise.success/ promise.error메소드에 대한 인수로 전달 된 콜백

있어요? 겉보기에 동일한 콜백을 전달하는이 두 가지 방법의 요점은 무엇입니까?

답변:


156

NB 이 답변은 사실 틀 렸습니다. 아래의 주석에서 지적한 것처럼 success ()는 원래 약속을 반환합니다. 나는 변하지 않을 것이다. 편집하려면 OP로 두십시오.


2의 주요 차이점은 .then()콜백이 콜백에서 반환 된 값으로 해결 된 약속을 반환하는 반면 .success()콜백을 등록하는 전통적인 방법이며 약속을 반환하지 않는다는 것입니다.

약속 기반의 콜백 ( .then()) 체인 약속 (전화를 할 결과를 해석하고 쉽게 그것을 확인 등 또 다른 호출을 수행, 결과를 해석, 다른 통화를 할).

.success()방법은 통화를 연결하거나 약속 API와 함께 작업 할 필요가없는 경우 (예 : 라우팅) 간소화되고 편리한 방법입니다.

한마디로 :

  • .then() -promise API의 강력한 기능이지만 약간 더 장황한
  • .success() -약속을 반환하지 않지만 약간 더 편리한 구문을 제공합니다.

44
또 다른 큰 차이가 있다는 것입니다 then응답을 - - 동안 콜백이 하나의 인수를 success하고 errorarguments-- 같은 응답의 개별 구성 요소를 가지고 data, status, header,와 config.
Michelle Tilley

1
@BrandonTilley는 완전히 옳았지만 질문의 저자는 이미 그것을 알아 냈으므로 여기에서 반복해야한다고 생각하지 않았습니다.
pkozlowski.opensource

45
문서에서 명시 적으로 말하지는 않지만 .success()체인 $http(...).success(...).error(...)이 가능하기 때문에 메소드가 원래 $ http promise 객체를 반환 한다고 추론 할 수 있습니다. 합리적으로 보이는 것처럼, 반대로 $http(...).error(...).success(...)도 가능하다면, .error()원래의 약속 객체를 반환해야합니다. 차이점은 새로운 약속을 .then()돌려 준다는 것입니다.
비트 뿌리 – 비트 뿌리

2
$ http 서비스의 angular.js 소스 코드 : promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
Alex Che

6
있습니다 success사용되지 않습니다. 에서 docs.angularjs.org/api/ng/service/$http#deprecation-notice The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
샘 바넘

204

여기에 이미 좋은 답변이 있습니다. 그러나 제공되는 병렬 처리의 차이점을 집으로 몰아 넣는 것이 좋습니다.

  • 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()병렬

3
a then에 도달하면 반환 된 새 약속 응답 에 successerror메소드가 사라집니다. 또한, HTTP 오류 응답 (예 : 404)에 대한 최초 then의이 http.then(ok, err).then(ok, err)받는 통과 할 것이다 err핸들러하지만 다음과 같은 사람은에 전달합니다 ok핸들러입니다. 기본적 http.success().error().success().error()으로 체인 가능하지만 $ q 약속은 http 요청 처리가 아닌 구체적으로 처리의 약속과 순서에 관한 점에서 상당히 다릅니다. 내가 자세히 살펴볼 때까지 나는 이것을 이해하는데 어려움을 겪었다.
jimmont

1
@jimmont successerror약속의 정상 API하지, 그들은) ($ HTTP의 반환 값에 볼트로 고정되어있다.
event_jr

감사합니다 @event_jr 이것은 나에게 분명하고 문서에서 호출되었습니다. 분명하지 않은 것은 $ q와 $ http가 다른 문제를 해결하는 방법과 새로운 약속을 반환하는 것과 같은 것을 통과시키는 것뿐만 아니라 (매우 도움이되는) 대답에서 지적한 것과 같습니다.
jimmont

1
JS가 단일 스레드이기 때문에 병렬이란 무엇입니까? 실행 순서가 비 결정적이라는 것을 의미합니까?
Derek

2
@Derek은 success첫 번째 실행 후 실행되지만 약속에서 반환 된 약속이 해결되기 전에 두 번째 실행 then됩니다. 약속을 반환하지 않으면 둘 다 동일하게 동작합니다.
Tamlyn

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
});

사용 success/ error:

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

5
고맙지 만 문제는 이러한 기능의 차이점이나 동일한 기능을 수행하는 경우 두 기능이 존재하는 이유에 대한 것입니다. 그것들을 사용하는 방법의 차이점은 문서에서 이해할 수 있습니다.
ejoubaud 2013 년

39
나는 개인적으로 짧은 코드 예제를 좋아하며 여기에 게시했습니다. Angular 문서는 때로는 짧은 정확한 예제를 놓칩니다.
TheHippo

2
첫 번째 요점의 응답 객체에 두 번째 요지의 "데이터, 상태, 헤드 및 구성"이 포함되어 있다는 사실을 강조해야합니다. 즉, 응답 객체에는 깊이 수준이 한 수준으로 있습니다.
geoom

data,status,header,config단순히 반환 하는 것보다 응답 값을 변수에 전달하면 어떤 이점이 response있습니까?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

27

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


"또 다른 약속"이 작동하는 방법을 보여주는 유일한 답변
zjk

17

완료를 위해 차이점을 나타내는 코드 예제는 다음과 같습니다.

성공 \ 오류 :

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

좋은!, 연결이 유용 할 수있는 예가 있습니까?
geoom

4
아이디어는 비동기 작업을 하나씩보다 쉽게 ​​작성할 수 있기 때문에 "then"접근 방식이 더 유용하다는 것입니다.
MichaelLo

2

공식 공지 : 성공과 오류는 더 이상 사용되지 않습니다. 대신 표준 방법을 사용하십시오.

더 이상 사용되지 않음 공지 : $ http 기존 약속 방법 성공 및 오류는 더 이상 사용되지 않습니다. 대신 표준 then 메소드를 사용하십시오. $ httpProvider.useLegacyPromiseExtensions가 false로 설정된 경우 이러한 메소드는 $ http / legacy 오류를 발생시킵니다.

링크 : https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

스크린 샷 : 스크린 샷보기

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.