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

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

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

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

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

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

6 ответов


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


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

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

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

короче:

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

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

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