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