jQuery.обработка ajax продолжает ответы:" успех: "vs".готово"?



Я работаю с jQuery и AJAX уже несколько недель, и я видел два разных способа "продолжить" сценарий после вызова:success: и .done.



из синопсиса от документация jQuery получаем:




.done (): описание: добавление обработчиков, вызываемых при разрешении отложенного объекта.



успехов: (.ajax () option): функция, которая будет вызвана, если запрос преуспевает.




Итак, оба делают что-то после того, как вызов AJAX был завершен/разрешен. Могу ли я использовать один или другой случайным образом? В чем разница и когда один используется вместо другого?

562   2  

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

    Ничего не найдено.