[angularjs] Angular HttpPromise : ‘성공’/ ‘오류’메소드와 ‘그런 다음’인수의 차이점

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

표준 then 메소드와 두 개의 http 특정 메소드 ( successerror)를 가진 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){/*...*/})
  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 ()이 해결 될 때까지 기다립니다.

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


답변

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

성공 \ 오류 :

$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

스크린 샷 : 스크린 샷보기


답변