jQuery.обработка ajax продолжает ответы:" успех: "vs".готово"?
Я работаю с jQuery и AJAX уже несколько недель, и я видел два разных способа "продолжить" сценарий после вызова:success: и .done.
из синопсиса от документация jQuery получаем:
.done (): описание: добавление обработчиков, вызываемых при разрешении отложенного объекта.
успехов: (.ajax () option): функция, которая будет вызвана, если запрос преуспевает.
Итак, оба делают что-то после того, как вызов AJAX был завершен/разрешен. Могу ли я использовать один или другой случайным образом? В чем разница и когда один используется вместо другого?
2 ответов:
successбыло традиционное имя успешного обратного вызова в jQuery, определенное как опция в вызове ajax. Однако с момента реализации$.Deferredsи более сложные вызовы,doneявляется предпочтительным способом реализации успешных обратных вызовов, так как он может быть вызван на любомdeferred.например, успех:
$.ajax({ url: '/', success: function(data) {} });например, сделать:
$.ajax({url: '/'}).done(function(data) {});хорошая вещь о
doneзаключается в том, что возвращаемое значение$.ajaxтеперь a отложенное обещание, которое может быть привязано к любому другому месту в вашем приложении. Итак, предположим, вы хотите сделать этот вызов 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точно так же.
Если вам нужно
async: falseв вашем ajax, вы должны использоватьsuccessвместо.done. Иначе вам лучше использовать.done. Это от официальный сайт jQuery:по состоянию на jQuery 1.8, использование async: false С jqXHR ($.Отложено) является устаревшим; вы должны использовать success / error / complete функции обратного вызова вместо соответствующие методы объекта jqXHR, такие как jqXHR.сделано().
Comments