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