jQuery $ .ajaxError () работает на 200 - ОК - PullRequest
9 голосов
/ 08 декабря 2010

У меня есть глобальный обработчик ошибок ajax, который работает, даже если xhr.status равен 200, xhr.statusText имеет значение «OK», а xhr.responseText - моя строка JSON. Это происходит в Firefox и IE.

$.ajax({
    data: {
        method: "getRequestDetails",
        loggedInUsername: loggedInUsername,
        search: search
    },
    success: function(data){
        var arrayObject = eval("(" + data + ")")['DATA'];
        if (arrayObject.length == 0){
            alert("That search term returned no results");
        } else {
            callBeforeShow("Results");
            $.each(arrayObject, function(index, value){
                showJSON(value, "Results");
            });
            callAfterShow("Results");
        }
    }
});

$(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){
    var errorMessage = "Ajax Error\n";
    errorMessage += "Type: " + ajaxOptions.type + "\n";
    errorMessage += "Requesting Page: " + ajaxOptions.url + "\n";
    errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText + "\n";
    errorMessage += "Error Thrown: " + thrownError
    alert(errorMessage);
});

В IE это говорит о том, что XMLHttpRequest не готов, а в Firefox это возвращает

«Ошибка AJAX» "Тип: ПОСТ" "Страница запроса: что-то. CFC" «Статус: 200 - ОК» «Ошибка выдана: не определено»

Так что моя работа заключается в использовании

$(document).ajaxComplete(function(event, XMLHttpRequest, ajaxOptions, errorThrown){
    if (XMLHttpRequest.status != 200){
        var errorMessage = "Ajax Error\n";
        errorMessage += "Type: " + ajaxOptions.type + "\n";
        errorMessage += "Requesting Page: " + ajaxOptions.url + "\n";
        errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText;
        alert(errorMessage);
    }
});

EDIT * Это случается только в некоторых случаях. В большинстве случаев это работает, но иногда запускается $ .ajaxError () * Eidt

{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}

Последняя версия firebug распознает его как json.

Ответы [ 4 ]

5 голосов
/ 13 декабря 2010

Прежде всего, я бы настоятельно рекомендовал отказаться от части eval в пользу использования $ .parseJson или опции dataType:'json' ajax, которая автоматически обрабатывает синтаксический анализ (среди прочего, из-за соображений производительности и безопасности).Если вы продолжаете использовать eval, по крайней мере, оберните его, это попытка поймать.

Я не совсем уверен в каждом случае, когда вызывается ajaxError, но я подозреваю (на основе "случайности«ошибки», что это связано с ошибкой внутри функции успеха (например, eval вызывается на неверном JavaScript, который вы получаете в своем ответе).Это объясняет, почему он вызывается, даже когда существует ответ 200.

tldr: вывести eval из этого success обратного вызова и утверждать, что ваши ответы на самом деле являются действительными json, когда возникает эта ошибка.

3 голосов
/ 08 декабря 2010

Может быть потому, что вы не говорите $.ajax, что вы ожидаете JSON от сервера?Попробуйте установить для параметра dataType значение «json»:

$.ajax({
    dataType: 'json',
    data: { ...
1 голос
/ 16 декабря 2010

ах, через несколько дней поиска я закомментировал различные настройки в $ .ajaxSetup ().В итоге я установил тайм-аут.Если бы только было лучшее сообщение об ошибке.Спасибо за помощь, ребята, не получили бы сюда, если бы не вы.Вы все набираете голоса !!!

1 голос
/ 16 декабря 2010

Я получаю две ошибки, когда копирую и вставляю этот json в этот форматтер / валидатор http://jsonformatter.curiousconcept.com/

2 x запятая отсутствует между {{*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...