Согласно 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
скриншот: посмотреть скриншот