Angular HttpPromise: разница между методами `success`/` error` и `then` аргументами

Согласно AngularJS doc, вызовы $http возвращают следующее:

Возвращает объект обещание со стандартным и методом и двумя http-специфическими методами: успех и ошибка. Метод then принимает два аргумента успех и обратный вызов ошибка, который будет вызываться с объектом ответа. В методах Успешное и ошибка используется один аргумент - функция, которая будет вызываться, когда запрос будет успешным или завершится с ошибкой соответственно. Аргументы, передаваемые в эти функции, представляют собой деструктивное представление объекта ответа, переданного в метод then.

Помимо того факта, что объект response разрушен в одном случае, я не получаю разницу между

  • обратные вызовы успеха/ошибки, переданные в качестве аргументов promise.then
  • обратные вызовы, переданные в качестве аргументов для методов promise.success/promise.error обещания

Есть ли какие-нибудь? Какова точка этих двух разных способов передачи кажущихся одинаковыми обратных вызовов?

Ответ 1

NB Этот ответ фактически неверен; как указано в комментарии ниже, success() возвращает первоначальное обещание. Я не изменюсь; и оставьте его OP для редактирования.


Основное отличие между 2 заключается в том, что вызов .then() возвращает обещание (разрешенное со значением, возвращаемым от обратного вызова), в то время как .success() является более традиционным способом регистрации обратных вызовов и не возвращает обещание.

Запросы на основе обещаний (.then()) упрощают цепочку promises (выполняют вызов, интерпретируют результаты, а затем выполняют другой вызов, интерпретируют результаты, выполняют еще один вызов и т.д.).

Метод .success() является упрощенным, удобным способом, когда вам не нужно связывать вызов и работать с API обещаний (например, при маршрутизации).

Короче:

  • .then() - полная мощность API обещаний, но немного более подробный
  • .success() - не возвращает обещание, но предлагает несколько более убедительный синтаксис

Ответ 2

Здесь есть несколько хороших ответов. Но стоит поехать домой разницу в parallelism, предлагаемую:

  • 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() параллельно

Ответ 3

Некоторые примеры кода для простого запроса 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
});

Ответ 4

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

Рабочие примеры:

Здесь что-то я написал в более codey формате, чтобы обновить мою память о том, как все это происходит с ошибками обработки и т.д.:

http://jsfiddle.net/nalberg/v95tekz2/

Ответ 5

Просто для завершения, вот пример кода, указывающий различия:

успех\ошибка:

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

Ответ 6

Официальное уведомление: успех и ошибка устарели, используйте вместо этого стандартный метод then.

Примечание об устаревании: Успешные и ошибочные методы обещания $ http устарели. Вместо этого используйте стандартный метод then. Если для $ httpProvider.useLegacyPromiseExtensions установлено значение false, эти методы выдают ошибку $ http/legacy.

ссылка: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

скриншот: посмотреть скриншот