Использовать success() или complete() в вызове AJAX
Я хочу понять вызов AJAX ниже, в терминах метода complete()
;
Когда я заменяю complete()
на success()
, я получаю пустой ответText так же, как с помощью метода 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;
});
Ответы
Ответ 1
complete
выполняется после выполнения обратного вызова success
или error
.
Возможно, вам нужно также проверить второй параметр complete
. Это String, поддерживающая тип успеха ajaxCall.
Различные обратные вызовы описаны здесь немного подробнее jQuery.ajax( options )
Я думаю, вы упустили тот факт, что функция complete
и success
(я знаю несогласованный API) получает разные данные, переданные в. success
получает только данные, complete
получает весь объект XMLHttpRequest
, Конечно, в строке данных нет свойства responseText
.
Итак, если вы замените complete
на success
, вам также нужно заменить data.responseText
на data
.
успех
Функция получает два Аргументы: данные, возвращенные из сервер, отформатированный в соответствии с 'dataType' и строка описывая статус.
полный
Функция получает два arguments: объект XMLHttpRequest и строка, описывающая тип успех запроса.
Если вам нужен доступ ко всему объекту XMLHttpRequest
в обратном вызове успеха, я предлагаю попробовать это.
var myXHR = $.ajax({
...
success: function(data, status) {
...do whatever with myXHR; e.g. myXHR.responseText...
},
...
});
Ответ 2
Является ли это, что success()
возвращает раньше complete()
?
Да; метод AJAX success()
выполняется до метода complete()
.
Ниже приведена диаграмма, иллюстрирующая поток процесса:
![AJAX схема процесса вызова вызова.]()
Важно отметить, что
-
success()
(Локальное событие) вызывается только в том случае, если запрос был успешным (никаких ошибок с сервера, никаких ошибок с данными).
-
С другой стороны, complete()
(Локальное событие) вызывается независимо от того, был ли запрос успешным, или нет. Вы всегда получите полный обратный вызов, даже для синхронных запросов.
... подробнее о событиях AJAX здесь.
Ответ 3
"complete" выполняется, когда вызов ajax завершен. "success" выполняется, когда вызов ajax заканчивается успешным кодом ответа.