Angular HttpPromise: разница между методами "success" / "error" и аргументами " then
по данным AngularJS doc вызовы $http
возвращает следующее:
возвращает a обещание объект со стандартным затем метод и два http-метода:успехов и . Элемент затем метод принимает два аргумента a успехов и обратный вызов, который будет вызван с объектом ответа. Элемент успехов и методы принимают один аргумент-функцию, которая будет вызываться при успешном выполнении или сбое запроса соответственно. Аргументы, переданные в эти функции, являются деструктурированным представлением объекта ответа, переданного в метод then.
помимо того, что response
объект разрушается в одном случае, я не понимаю разницы между
- успешные / ошибочные обратные вызовы, переданные для передачи в качестве аргументов
promise.then
- обратные вызовы передаются в качестве аргументов для
promise.success
/promise.error
методы обещание
есть ли? В чем смысл этих двух разных способов передачи, казалось бы, одинаковых обратных вызовов?
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){/*...*/})
$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 success и error были устаревшими. Вместо этого используйте стандартный метод then. Если $httpProvider.useLegacyPromiseExtensions имеет значение false, то эти методы выдадут ошибку $http / legacy.
ссылка: https://code.angularjs.org/1.5.7/docs/api/ng/service / $http