JQuery $.ajax statusCode Else
В вызове jquery Ajax я в настоящее время обрабатываю statusCode 200 и 304. Но у меня также есть "ошибка", определяемая "Чтобы уловить любые ошибки, которые могут вернуться".
Если есть связанное с проверкой сообщение, мы возвращаем код состояния 400 - Bad Request.
Затем он попадает в функцию "Ошибка" перед тем, как попасть в функцию "400" statusCode, которую я определил. Это означает, что происходят два действия.
В идеале я бы не хотел определять "Ошибка" и "Успех" и определять только "statusCode". Но мне нужно иметь "Else", так что мне не нужно объявлять каждый statusCode, который существует только для 2 -3 Я хочу работать по-разному.
$.ajax({
type: 'POST',
contentType: "application/json",
url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId,
data: jsonString,
statusCode: {
200: function () { //Employee_Company saved now updated
hideLoading();
ShowAlertMessage(SaveSuccessful, 2000);
$('#ManageEmployee').dialog('close');
},
304: function () { //Nothing to save to Employee_Company
hideLoading();
$('#ManageEmployee').dialog('close');
if (NothingToChange_Employee) {
ShowAlertMessage(NothingToUpdate, 2000);
} else {
ShowAlertMessage(SaveSuccessful, 2000);
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
AjaxError(XMLHttpRequest, textStatus, errorThrown);
}
});
Ответы
Ответ 1
Поскольку "полное" событие всегда срабатывает, вы можете просто получить код состояния оттуда и игнорировать функции успеха и ошибок
complete: function(e, xhr, settings){
if(e.status === 200){
}else if(e.status === 304){
}else{
}
}
Ответ 2
Это то, что я использовал:
error: function (xhr, textStatus, errorThrown) {
switch (xhr.status) {
case 401:
// handle unauthorized
break;
default:
AjaxError(xhr, textStatus, errorThrown);
break;
}
}
Ответ 3
jQuery Ответ AJAX complete
, success
, error
устарел. Вместо этого обновляется более современная версия с .done
, .fail
, .always
.
При успехе .always
имеет подпись .done
, при сбое его подпись меняется на подпись .fail
. Используя textStatus
, вы можете захватить правильную переменную и вернуть содержимое тела.
var jqxhr = $.ajax( {
type: frm.attr('method'),
url: frm.attr('action'),
data: frm.serialize(),
dataType: 'json',
} )
.done(function( data, textStatus, jqXHR ) {
alert( "success" );
})
.fail(function( jqXHR, textStatus, errorThrown ) {
alert( "error" );
})
.always(function( data_jqXHR, textStatus, jqXHR_errorThrown ) {
if (textStatus === 'success') {
var jqXHR = jqXHR_errorThrown;
} else {
var jqXHR = data_jqXHR;
}
var data = jqXHR.responseJSON;
switch (jqXHR.status) {
case 200:
case 201:
case 401:
default:
console.log(data);
break;
}
});
jqxhr.always(function() {
alert( "second complete" );
});
Ответ 4
Чтобы приблизить подход к вашей исходной логике, я продолжал бы передавать объект statusCode. Тем не менее, вы все еще знаете, что "else" попадет в область ошибок кода типа 4xx или 5xx.
Итак, я бы обновил исходный код до:
var statusCodeResponses = {
200: function () { //Employee_Company saved now updated
hideLoading();
ShowAlertMessage(SaveSuccessful, 2000);
$('#ManageEmployee').dialog('close');
},
304: function () { //Nothing to save to Employee_Company
hideLoading();
$('#ManageEmployee').dialog('close');
if (NothingToChange_Employee) {
ShowAlertMessage(NothingToUpdate, 2000);
} else {
ShowAlertMessage(SaveSuccessful, 2000);
}
}
};
var genericElseFunction = function(response){
// do whatever other action you wanted to take
};
for(var badResponseCode=400; badResponseCode<=599; badResponseCode++){
statusCodeResponses[badResponseCode] = genericElseFunction;
}
$.ajax({
type: 'POST',
contentType: "application/json",
url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId,
data: jsonString,
statusCode: statusCodeResponses,
error: function (XMLHttpRequest, textStatus, errorThrown) {
AjaxError(XMLHttpRequest, textStatus, errorThrown);
}
});