Подтвердить что ты не робот

Что изменилось в jQuery 1.9, чтобы вызвать неудачный вызов $.ajax с синтаксической ошибкой

Я делаю вызов REST DELETE, который возвращает значение 204. В jQuery 1.8.3 это работает и обращается к обратному запросу request.done. Но если я использую 1.9, он переходит к request.fail с parsererror в textStatus и "SyntaxError: Неожиданный конец ввода" в 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);
            });

        },

Кто-нибудь знает, что изменилось в 1.9, что приведет к сбою, и что нужно изменить, чтобы исправить его?

Итак, отвечая на мой собственный вопрос, похоже, что это на самом деле проблема:

В руководстве по обновлению jQuery

jQuery.ajax возвращает результат JSON пустой строки

До 1.9, вызов ajax, ожидающий, что тип данных возврата JSON или JSONP будет рассматривать возвращаемое значение пустой строки как успешный случай, но возвращает значение null в обработчик или обещание. Начиная с 1.9, пустая строка, возвращаемая для данных JSON, считается некорректной JSON (потому что она есть); это приведет к ошибке. Используйте обработчик ошибок, чтобы поймать такие случаи.

Итак, если удалить dataType

dataType: "json",

Он работает в jQuery 1.8.3 и 1.9.

4b9b3361

Ответ 1

Ответ HTTP 204 не является пустой строкой: это означает, что нет данных. Это действительный ответ для операций удаления и обновления.

Это выглядит как ошибка введенная в JQuery 1.9.

Причина удаления свойства dataType исправляется, потому что, когда он установлен на "json", JQuery пытается проанализировать содержимое с использованием JSON.parse и в результате не удается. Из билета:

Это не сработает с любым другим типом данных, чем "json", потому что регрессия связана с переустановкой parseJSON с родным JSON.parse(выбрасывает исключение для значений null/ undefined).

Не пытайтесь обходным путем, предложенным в билете добавления обработчика для 204 через свойство statusCode, потому что и этот обработчик, и обработчик ошибок будут запущены. Возможным решением является следующее:

    $.ajax(url, {
    type: "DELETE",
    dataType: "json",
    error: function (error) {
        if (error.status === 204) {
            // Success stuff
        }
        else {
            // fail
        }
    }});

Ответ 2

У меня была очень похожая проблема, и вы помогли мне найти мой ответ - так что спасибо. Мое решение, однако, немного отличается, поэтому я решил, что хочу поделиться им.

Как указано в вопросе, на веб-сайте JQuery говорится:

До 1.9, вызов ajax, ожидающий, что тип данных возврата JSON или JSONP будет рассматривать возвращаемое значение пустой строки как успешный случай, но возвращает значение null в обработчик или обещание. Начиная с 1.9, пустая строка, возвращаемая для данных JSON, считается некорректной JSON (потому что она есть); это приведет к ошибке. Используйте обработчик ошибок, чтобы поймать такие случаи.

Я передавал данные JSON методу на моем сервере с "void" как возвращаемым типом, потому что мне не нужно было ничего делать с возвращенными данными в функции успеха. Вы не можете больше возвращать null при передаче JSON в запросе AJAX в JQuery 1.9+. Это было возможно в предыдущих версиях JQuery.

Чтобы прекратить получение ошибки и вместо этого запустить функцию успеха, вы должны просто вернуть действительный JSON в свой запрос AJAX. Неважно, что вы проходите, если оно действительно, потому что (в любом случае, в моем случае) вы не используете возвращенные данные.

Ответ 3

Проблема заключается в том, что jQuery обрабатывает пустое тело (где Content-Length равно 0) ответа 204 как ". Это одна интерпретация, но недостатком является то, что" "обрабатывается как любая другая строка ответа. Поэтому, если вы вызвали jQuery.ajax() с параметром dataType: json, jQuery пытается преобразовать" "в объект и выдает исключение (" "недействителен JSON" ).

jQuery ловит исключение и восстанавливается, но если вы предпочитаете вообще избегать исключения (в своей среде разработки), вы можете сделать что-то вроде следующего. Добавьте в параметр "конверторы" значение jQuery.ajax() и используйте его для изменения ответов "" на нули (я делаю это, когда dataType - json). Что-то вроде:

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