Jquery $ .ajax statusCode Else

在jquery Ajax调用中,我正在处理200和304的statusCode。但是我也定义了“错误”“捕获可能返回的任何错误。

如果存在相关的validation消息,则返回状态代码400 – 错误请求。

然后在进入我定义的statusCode“400”函数之前进入“错误”函数。 这意味着两个动作发生。

理想情况下,我不想定义“错误”和“成功”,只定义“statusCode”但我需要的是有一个“Else”,这样我就不需要声明每个只存在2-3个的statusCode想要区别对待。

$.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); } }); 

由于“完整”事件总是被触发,您可以从那里简单地获取状态代码并忽略成功和错误函数

 complete: function(e, xhr, settings){ if(e.status === 200){ }else if(e.status === 304){ }else{ } } 

这是我用的:

 error: function (xhr, textStatus, errorThrown) { switch (xhr.status) { case 401: // handle unauthorized break; default: AjaxError(xhr, textStatus, errorThrown); break; } } 

jQuery AJAX响应completesuccesserror已被弃用。 使用.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" ); }); 

为了使方法与初始逻辑类似,我将继续传递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); } });