Согласно AngularJS doc , звонки, чтобы $http
вернуть следующее:
Возвращает объект обещания со стандартным методом then и двумя http-специфическими методами: success и error . Метод then принимает два аргумента: успех и обратный вызов ошибки, который будет вызван с объектом ответа. В успехе и ошибка метода принимает единственный аргумент - функцию , которая будет вызвана , когда запрос успешно или не соответственно. Аргументы, передаваемые в эти функции, представляют собой деструктурированное представление объекта ответа, переданного в метод then.
Помимо того факта, что response
объект был разрушен в одном случае, я не понимаю разницу между
- обратные вызовы об успехе / ошибке передаются в качестве аргументов
promise.then
- обратные вызовы, переданные в качестве аргументов для
promise.success
/promise.error
методов обещания
Есть ли? Какой смысл в этих двух разных способах передавать, казалось бы, идентичные обратные вызовы?
then
обратные вызовы принимают единственный аргумент - ответ - в то время какsuccess
иerror
принимать отдельные компоненты реакции как arguments--data
,status
,header
, иconfig
..success()
метод возвращает исходный объект обещания $ http, поскольку цепочка$http(...).success(...).error(...)
возможна. Если, как представляется разумным, обратное$http(...).error(...).success(...)
также возможно, тогда.error()
также следует вернуть исходный объект обещания. Отличительная особенность.then()
заключается в том, что он возвращает новое обещание.promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
это устарело. От docs.angularjs.org/api/ng/service/$http#deprecation-noticeThe $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
Здесь уже есть несколько хороших ответов. Но стоит довести до ума разницу в предложенном параллелизме:
success()
возвращает первоначальное обещаниеthen()
возвращает новое обещаниеРазница заключается в
then()
последовательных операциях, поскольку каждый вызов возвращает новое обещание.$http.get()
seqFunc1()
seqFunc2()
success()
управляет параллельными операциями, поскольку обработчики связаны одним и тем же обещанием.$http.get()
parFunc1()
,parFunc2()
Параллельноисточник
then
достижении a, приводит к исчезновению методовsuccess
иerror
. Кроме того, для ответов об ошибках http (например, 404) первыйthen
входhttp.then(ok, err).then(ok, err)
будет переданerr
обработчику, а следующие будут переданы вok
обработчик. По сути, ониhttp.success().error().success().error()
являются цепочечными, но обещания $ q весьма различны в том смысле, что все они связаны именно с обещанием и последовательностью обработки (а не обработкой http-запроса). Мне было трудно понять это, пока я не посмотрел внимательно.success
иerror
не являются обычным API обещания, они привязаны к возвращаемому значению $ http ().success
будет выполнен после того, как первый будет выполнен, но прежде, чем любое обещание, возвращенное из него, будет решено, тогда как второйthen
будет ждать. Если вы не отвечаете на обещания, тогда оба ведут себя одинаково.Несколько примеров кода для простого запроса GET. Может быть, это помогает понять разницу. Использование
then
:Используя
success
/error
:источник
data,status,header,config
сравнению с простым возвратомresponse
?.then () является цепным и будет ждать разрешения предыдущего .then ().
.success () и .error () могут быть объединены в цепочку, но все они будут срабатывать одновременно (так что особого смысла в этом нет)
.success () и .error () просто хороши для простых вызовов (easy makers):
так что вам не нужно вводить это:
Но обычно я обрабатываю все ошибки с помощью .catch ():
Если вам нужно поддерживать <= IE8, напишите ваши .catch () и .finally () следующим образом (зарезервированные методы в IE):
Рабочие примеры:
Вот что я написал в более кодовом формате, чтобы освежить память о том, как все это работает с ошибками и т. Д.
http://jsfiddle.net/nalberg/v95tekz2/
источник
Просто для завершения, вот пример кода, показывающий различия:
успех \ ошибка:
затем:
источник
Официальное уведомление: успех и ошибка устарели, используйте вместо этого стандартный метод then.
ссылка: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
скриншот: посмотреть скриншот
источник