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


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

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

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

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

есть ли? В чем смысл этих двух разных способов передачи, казалось бы, одинаковых обратных вызовов?

6 173

6 ответов:

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


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

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

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

короче:

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

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

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

.затем () цепляется и будет ждать предыдущего .затем () разрешить.

.успех и. ошибка() может быть прикован, но они все будут стрелять сразу (так что не так много смысла в этом)

.успех и. error () просто хороши для простых вызовов (easy makers):

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

Если вам нужно поддерживать

    .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 success и error были устаревшими. Вместо этого используйте стандартный метод then. Если $httpProvider.useLegacyPromiseExtensions имеет значение false, то эти методы выдадут ошибку $http / legacy.

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

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