2012-04-06 27 views
23

En una llamada jQuery Ajax Actualmente estoy manejando statusCode de 200 y 304. Pero también tengo "error" definido" para detectar los errores que podrían volver.

Si hay una mensaje de validación relacionado volvemos el código de estado de 400 -. Solicitud incorrecta

Esto entonces cae en la función de "error" antes de caer en la función statusCode "400" que había definido que significa dos acciones ocurren

.. Idealmente, me gustaría no definir "Error" y "Éxito" y solo definir "código de estado". Pero lo que necesito es tener un "otro" para que no necesite para declarar cada código de estado que existe solo los 2-3 que deseo manejar de manera diferente.

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

Respuesta

29

Dado que el evento "completa" siempre se dispara simplemente podría obtener el código de estado de allí y pasar por alto las funciones de éxito y error

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

    }else if(e.status === 304){ 

    }else{ 

    } 
} 
+0

esto parece que funciona bastante bien y es una buena respuesta, aunque en mi situación que terminó con realidad usando tanto el éxito y han fracasado. y haz una declaración similar si tienes arriba en cada una. – Steve

+12

complete() ahora está en desuso. Use los métodos de hacer, fallar, siempre reemplazar. – redochka

9

Esto es lo que haría uso:

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

jQuery AJAX respuesta complete, success, error han quedado en desuso. Versión más actualizada con .done, .fail, .always promesa en su lugar.

En caso de éxito .always tiene la firma de .done, en caso de error es la firma cambia a la de .fail. Con el textStatus puede tomar la variable correcta y devolver el contenido del cuerpo.

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"); 
}); 
+0

'jqXHR.error()' ha quedado obsoleto, no la opción 'error' en' jQuery.ajax() '. No sé si está desaprobado implícitamente junto con él, pero al menos no está documentado como obsoleto. – falstro

1

Para mantener el enfoque similar a su lógica inicial, seguiría pasando un objeto statusCode. Sin embargo, usted todavía sabe que "else" caerá en el ámbito de los códigos de error tipo 4xx o 5xx.

Así que me gustaría actualizar el código original a:

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