GearHead корректен, за исключением того, что парсер jQuery на самом деле достаточно умен, чтобы теперь обрабатывать пустой пустой ответ как ноль, а не пытаться его проанализировать.
Однако, если у вас есть вызовы, которые иногда получают json, а иногда получают ответ head
, и у вас нет доступа к серверу или вы не хотите изменять все свои head
вызовы, вы можете сделать это альтернативное решение :
Проблема в том, что Rails отправляет один пробел в качестве пустого ответа, когда вы используете head
(см. Здесь: Как вернуть действительно пустое тело в рельсах?, Т.е. content-length 0 )
На момент написания этой статьи соответствующие части функции jQuery parseJSON выглядят так:
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
Как видите, jQuery проверяет, является ли данные пустой строкой перед тем, как обрезает ее. Затем он пытается JSON.parse("")
, который вы видите в консоли, приводит к ошибке, вызывая обратный вызов ошибки ajax с помощью оператора catch
.
Есть простое исправление. jQuery позволяет вам использовать конвертеры, когда запрашивается один тип данных, а другой возвращается. Подробнее смотрите здесь: http://api.jquery.com/extending-ajax/
Поскольку ответ rails head
отображается как текст, вы можете просто определить конвертер текста в json, который обрежет ответ перед попыткой его проанализировать. Просто добавьте этот фрагмент:
// deal with rails ' ' empty response
jQuery.ajaxSetup({
converters: {
"text json": function (response) {
jQuery.parseJSON($.trim(response))
}
}
})