Используйте success () или complete () в вызове AJAX - PullRequest
36 голосов
/ 20 июня 2009

Я хочу понять вызов AJAX ниже с точки зрения метода complete();

Когда я заменяю complete() на success(), я получаю пустой responseText , как и в методе AJAX error().

С другой стороны, когда я оставляю метод complete() таким, какой он есть, все работает как положено.

Это что success() возвращается раньше, чем complete()?

$("#formnaw").submit(function() {
  var fnc = invoerFnc.attr("value");
  var vnaam = invoerVnaam.attr("value");
  var anaam = invoerAnaam.attr("value");
  var str1 = invoerStr1.attr("value");
  var nr1 = invoerNr1.attr("value");
  var pc1 = invoerPc1.attr("value");
  var pl1 = invoerPl1.attr("value");
  var tel1 = invoerTel1.attr("value");
  var mob1 = invoerMob1.attr("value");
  var em1 = invoerEm1.attr("value");
  var goknop = $("#formnaw > .instelling_go");
  //we deactiveren de submit knop tijdens het verzenden 
  goknop.attr({
    disabled: true
  });
  goknop.blur();
  //stuur de post variabelen naar livetabs.php
  $.ajax({
    type: "POST",
    url: "registraties/instellingenact.php",
    data: "actie=wijzignaw&vnaam=" + vnaam + "&anaam=" + anaam + "&functie=" + fnc + "&straat=" + str1 + "&nr=" + nr1 + "&postcode=" + pc1 + "&plaats=" + pl1 + "&tel=" + tel1 + "&mob=" + mob1 + "&email=" + em1,
    timeout: 5000,
    success: function(data, textStatus) {
        alert('bij success');
        //doe iets
      } //EINDE success
      ,
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (textStatus == 'timeout') {
          //doe iets
        } else if (textStatus == 'error') {
          //doe iets
        }
        //her-activeer de zend knop
        goknop.attr({
          disabled: false
        });
      } //EINDE error
      ,
    complete: function(data) {
        updatelijst.append(data.responseText + "<br>");
        if (data.responseText.indexOf("Fout") != -1) {
          $('#formnaw').find('td.foutnr1').prepend(data.responseText);
        } else {
          updatelijst.animate({
            opacity: 'show'
          }, 1000, function() {});
        }
        //her-activeer de zend knop
        goknop.attr({
          disabled: false
        });
      } //EINDE complete
  }); //EINDE ajax
  //we stoppen het standaard gedrag van een submit, zodat de pagina niet wordt vernieuwd.
  return false;
});

Ответы [ 3 ]

48 голосов
/ 20 июня 2009

complete выполняется после выполнения обратного вызова success или error.

Возможно, вам следует проверить и второй параметр complete предложения. Это строка, содержащая тип успеха, который имел ajaxCall.

Различные обратные вызовы описаны здесь более подробно jQuery.ajax( options )


Полагаю, вы упустили тот факт, что функции complete и success (я знаю, что API несовместим) передают разные данные. success получает только данные, complete получает весь объект XMLHttpRequest , Конечно, в строке данных нет свойства responseText.

Поэтому, если вы замените complete на success, вам также придется заменить data.responseText только на data.

успех

Функция получает два аргументы: данные, возвращаемые из сервер, отформатированный в соответствии с Параметр dataType и строка описание статуса.

полная

Функция получает два аргументы: объект XMLHttpRequest и строка, описывающая тип Успешность запроса.

Если вам нужен доступ ко всему объекту XMLHttpRequest в обратном вызове успеха, я предлагаю попробовать это.

var myXHR = $.ajax({
    ...
    success: function(data, status) {
        ...do whatever with myXHR; e.g. myXHR.responseText...
    },
    ...
});
39 голосов
/ 14 февраля 2017

Это что success() возвращается раньше, чем complete()?

Да ; метод AJAX success() выполняется перед методом complete().

Ниже приведена схема, иллюстрирующая ход процесса:

AJAX call process flow diagram.

Важно отметить, что

  • success() (локальное событие) вызывается только в том случае, если запрос был успешным (без ошибок с сервера, без ошибок с данными).

  • С другой стороны, complete() (локальное событие) вызывается независимо от того, был ли запрос успешным или нет. Вы всегда получите полный обратный вызов, даже для синхронных запросов.

... подробнее об AJAX Events здесь .

12 голосов
/ 20 июня 2009

«complete» выполняется после завершения вызова ajax. «success» выполняется, когда вызов ajax заканчивается кодом успешного ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...