Lo que cambió en jQuery 1.9 para causar una llamada $.ajax para fallar con un error de sintaxis
jquery-1.9 (3)
Estoy haciendo una llamada REST DELETE, que devuelve un 204. En jQuery 1.8.3 esto funciona, y acierta la callback request.done. Pero si uso 1.9 va a request.fail con un parsererror en textStatus y un ''SyntaxError: Inesperado end of input'' en el errorThrown.
remove = function (complete) {
var self = this;
var request = $.ajax({
context: self,
url: "/v1/item/" + itemId,
dataType: "json",
type: "DELETE"
});
request.done(removeCallback);
request.fail(function (xhr, textStatus, errorThrown) {
alert(errorThrown);
});
},
Alguien sabe qué ha cambiado en 1.9 que haría que esto falle y qué necesita cambiar para solucionarlo.
Entonces, respondiendo mi propia pregunta, parece que este es, de hecho, el problema:
De la guía de actualización de jQuery
jQuery.ajax que devuelve un resultado JSON de una cadena vacía
Antes de 1.9, una llamada ajax que esperaba un tipo de datos de retorno de JSON o JSONP consideraría un caso de éxito como un valor de retorno de una cadena vacía, pero devuelve un valor nulo al manejador o promesa de éxito. A partir de 1.9, una cadena vacía devuelta para datos JSON se considera JSON malformada (porque lo es); esto ahora arrojará un error. Use el controlador de errores para detectar dichos casos.
Entonces, si elimina el tipo de datos
dataType: "json",
Funciona en jQuery 1.8.3 y 1.9.
El problema parece ser que jQuery trata el cuerpo vacío (donde Content-Length es 0) de una respuesta 204 como "". Que es una interpretación, pero la desventaja es que "" se trata como cualquier otra cadena de respuesta. Entonces, si ha llamado a jQuery.ajax () con la opción dataType: json, jQuery intenta convertir "" a un objeto y arroja una excepción ("" no es JSON).
jQuery detecta la excepción y se recupera, pero si prefiere evitar la excepción por completo (en su entorno de desarrollo), puede hacer algo como lo siguiente. Agregue la opción "conversores" a jQuery.ajax () y úselo para cambiar "" las respuestas a nulos (hago esto cuando dataType es json). Algo como :
var ajax_options =
{
/* ... other options here */
"converters" :
{
"text json" :
function( result )
{
if ( result === "" ) result = null;
return jQuery.parseJSON( result );
}
}
};
var dfd = jQuery.ajax( ajax_options );
Estaba teniendo un problema muy similar y me ayudaste a encontrar mi respuesta, así que gracias. Mi solución, sin embargo, es ligeramente diferente, así que pensé que la compartiría.
Como se indicó en la pregunta, en el sitio web de JQuery dice:
Antes de 1.9, una llamada ajax que esperaba un tipo de datos de retorno de JSON o JSONP consideraría un caso de éxito como un valor de retorno de una cadena vacía, pero devuelve un valor nulo al manejador o promesa de éxito. A partir de 1.9, una cadena vacía devuelta para datos JSON se considera JSON malformada (porque lo es); esto ahora arrojará un error. Use el controlador de errores para detectar dichos casos.
Estaba pasando datos JSON a un método en mi servidor con "nulo" como un tipo de devolución porque no tuve que hacer nada con los datos devueltos en la función de éxito. Ya no puede devolver nulo al pasar JSON en una solicitud AJAX en JQuery 1.9 +. Esto fue posible en versiones anteriores de JQuery sin embargo.
Para dejar de obtener un error y activar la función de éxito, simplemente debe devolver JSON válido en su solicitud de AJAX. No importa lo que pase, siempre y cuando sea válido, porque (en mi caso, de todos modos) no está utilizando los datos devueltos.
Una respuesta HTTP 204 no es una cadena vacía: significa que no hay datos. Esta es una respuesta válida para las operaciones de eliminación y actualización .
Esto parece un error introducido en JQuery 1.9 .
El motivo por el que se elimina la propiedad dataType corrige que esto se debe a que, cuando se establece en "json", JQuery intenta analizar el contenido utilizando JSON.parse y fallar como resultado. Del boleto:
Esto no fallará con ningún otro tipo de datos que "json" porque la regresión se debe a la realineación de parseJSON con el JSON.parse nativo (arrojando una excepción para valores nulos / indefinidos).
No intente la solución alternativa sugerida en el ticket de agregar un controlador para el 204 a través de la propiedad statusCode, porque se desencadenarán tanto ese controlador como el controlador de errores. Una posible solución es la siguiente:
$.ajax(url, {
type: "DELETE",
dataType: "json",
error: function (error) {
if (error.status === 204) {
// Success stuff
}
else {
// fail
}
}});