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){/*...*/})
$http.get()
seqFunc1()
seqFunc2()
success()
управляет параллельными операциями, так как обработчики прикованы к одному и тому же обещанию.
$http(/*...*/).
success(function parFunc1(data){/*...*/}).
success(function parFunc2(data){/*...*/})
$http.get()
-
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.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