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()
дни?