success
было традиционным именем обратного вызова успеха в jQuery, определенным как опция в вызове ajax. Однако, поскольку реализация $.Deferreds
и более сложные обратные вызовы, done
является предпочтительным способом реализации успешных обратных вызовов, так как он может быть вызван на любом deferred
.
Например, успех:
$.ajax({
url: '/',
success: function(data) {}
});
Например, сделано:
$.ajax({url: '/'}).done(function(data) {});
Хорошая вещь done
в том, что возвращаемое значение $.ajax
теперь является отложенным обещанием, которое может быть привязано к любому другому месту в вашем приложении. Допустим, вы хотите сделать этот вызов ajax из нескольких разных мест. Вместо прохождения в функции успеха в качестве опции функции , что делает этот вызов Ajax, вы можете просто иметь функцию возврата $.ajax
самого и связать ваши обратные вызовы с done
, fail
, then
или любой другой . Обратите внимание, что always
это обратный вызов, который будет запущен независимо от того, успешно или неудачно выполнен запрос. done
будет срабатывать только в случае успеха.
Например:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
Важным преимуществом этого с точки зрения удобства сопровождения является то, что вы включили свой механизм ajax в функцию для конкретного приложения. Если вы решите, что $.ajax
в будущем ваш вызов должен работать по-другому, или вы используете другой метод ajax, или вы уходите от jQuery, вам нужно только изменить xhr_get
определение (обязательно верните обещание или хотя бы done
метод, в случай примера выше). Все остальные ссылки в приложении могут оставаться неизменными.
Есть еще много (гораздо более крутых) вещей, с которыми вы можете работать $.Deferred
, одна из которых заключается в том, pipe
чтобы инициировать сбой при ошибке, сообщаемой сервером, даже когда сам $.ajax
запрос выполняется успешно. Например:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
Узнайте больше о $.Deferred
здесь: http://api.jquery.com/category/deferred-object/
ПРИМЕЧАНИЕ . Начиная с версии jQuery 1.8, pipe
она устарела в пользу использования then
точно таким же образом.
success:
/.done()
, если вообще. Например, какsuccess:
это реализовано в первые.done()
дни?success:
и другое.done
по вызову ajax? Хороший вопрос. Поскольку все другие обратные вызовы вызываются в том порядке, в котором они связаны, я думаю, что да,success
просто вызывается первым.pipe
один из тех случаев, когда сам запрос выполняется успешно, но сценарий на сервере не возвращает то, что вы искали. Возможно, вы не захотите выбрасывать фактические 404 или 500 или что-то еще на стороне сервера, потому что вы хотите существенно различать ответы http и ответы приложения. Задание кода ответа в JSON и последующее использованиеpipe
этого способа позволяет обрабатывать различные виды ошибок с большим количеством нюансов.Если вам нужен
async: false
Ajax, вы должны использоватьsuccess
вместо.done
. Остальное тебе лучше использовать.done
. Это с официального сайта jQuery :источник
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Объекты jqXHR, возвращаемые начиная с
$.ajax()
jQuery 1.5, реализуют интерфейс Promise, предоставляя им все свойства, методы и поведение Promise (см. Отложенный объект для получения дополнительной информации). Эти методы принимают один или несколько аргументов функции, которые вызываются при завершении$.ajax()
запроса. Это позволяет назначать несколько обратных вызовов для одного запроса и даже назначать обратные вызовы после того, как запрос может быть завершен. (Если запрос уже выполнен, обратный вызов запускается немедленно.) Доступные методы Promise объекта jqXHR включают в себя:Альтернативная конструкция для опции обратного вызова success, обратитесь к
deferred.done()
подробностям реализации.Альтернативная конструкция для опции обратного вызова с ошибкой,
.fail()
метод заменяет устаревший метод .error (). Обратитесь к deferred.fail () для деталей реализации.(добавлено в jQuery 1.6)
.always()
Метод, альтернативный завершенному варианту обратного вызова, метод заменяет устаревший.complete()
метод.В ответ на успешный запрос аргументы функции совпадают с аргументами
.done()
: data, textStatus и объекта jqXHR. Для неудачных запросов аргументы такие же, как у.fail()
объекта jqXHR, textStatus и errorThrown. Обратитесь кdeferred.always()
подробностям реализации.Включает в себя функциональность
.done()
и.fail()
методов, что позволяет (по состоянию на JQuery 1.8) лежащий в основе Promise манипулировать. Обратитесь к отложенному.then()
для деталей реализации.источник