success
срабатывает только в случае успешного вызова AJAX, то есть в конечном итоге возвращает статус HTTP 200. error
срабатывает в случае сбоя и complete
при завершении запроса независимо от успеха.
В jQuery 1.8 для объекта jqXHR
(возвращается $.ajax
) success
был заменен на done
, error
на fail
и complete
на always
.
Однако вы все равно сможете инициализировать запрос AJAX со старым синтаксисом. Итак, они делают похожие вещи:
// set success action before making the request
$.ajax({
url: '...',
success: function(){
alert('AJAX successful');
}
});
// set success action just after starting the request
var jqxhr = $.ajax( "..." )
.done(function() { alert("success"); });
Это изменение для совместимости с отложенным объектом в jQuery 1.5. Отложенный (и теперь Promise
, который имеет полную поддержку встроенного браузера в Chrome и FX) позволяет вам связывать асинхронные действия:
$.ajax("parent").
done(function(p) { return $.ajax("child/" + p.id); }).
done(someOtherDeferredFunction).
done(function(c) { alert("success: " + c.name); });
Эта цепочка функций проще в обслуживании, чем вложенная пирамида обратных вызовов, которую вы получаете с success
.
Тем не менее, обратите внимание, что done
теперь не рекомендуется в пользу синтаксиса Promise
, в котором вместо него используется then
:
$.ajax("parent").
then(function(p) { return $.ajax("child/" + p.id); }).
then(someOtherDeferredFunction).
then(function(c) { alert("success: " + c.name); }).
catch(function(err) { alert("error: " + err.message); });
Это стоит принять, потому что расширение async
и await
обещает улучшенный синтаксис (и обработку ошибок):
try {
var p = await $.ajax("parent");
var x = await $.ajax("child/" + p.id);
var c = await someOtherDeferredFunction(x);
alert("success: " + c.name);
}
catch(err) {
alert("error: " + err.message);
}