Имеете дело с ошибками AJAX, не вошли в систему и т. Д. - мысли об этом методе? - PullRequest
3 голосов
/ 17 марта 2011

Я пытаюсь настроить общий обработчик успеха / ошибки AJAX с помощью jQuery, который я могу использовать в нескольких проектах.Моя причина для этого - из-за ряда возможных «ошибок», которые могут произойти во время запроса AJAX.Вот те, которые я обработал до сих пор, и номер статуса:

  • 0: неизвестная ошибка
  • 1: успешная
  • 2: не авторизована
  • 3: истекло время ожидания
  • 4: не разрешено (на основе разрешений)
  • 404 Ошибка

Для первых 5 ошибок япришлось обращаться с ними вручную.Для этого единственный способ, который я смог найти, - это запустить метод cl4.process_ajax внутри функции успеха вызова AJAX с использованием ключа состояния / свойства в данных JSON, чтобы определить, каково состояние.Для ошибки 404 или какой-либо другой ошибки AJAX (т. Е. Непарсируемого JSON) я использовал глобальный обработчик событий ajaxError() в jQuery.

Основная идея заключается в том, что ошибка будет отображаться в верхней частиЭкран внутри #ajax_errors при возникновении ошибки сдвигается вниз, чтобы он выглядел «красиво».На каждую из ошибок можно нажать, чтобы скрыть их.

Вот пример того, как я использовал его.cl4.process_ajax также может быть вставлено в условие if, позволяющее коду выполняться только в том случае, если он был успешным.

$.getJSON('/path/to/page?c_ajax=1', function(return_data) {
    cl4.process_ajax(return_data);
    if (return_data !== null && typeof return_data == 'object' && typeof return_data.html != 'undefined') {
        $('#div').html(return_data.html);
    } else {
        $('#div').html('');
    }
});

Параметр запроса c_ajax сообщает логину и проверке разрешения на возвращение массива JSON вместоперенаправление пользователя на страницу входа или отсутствия доступа, как обычно.

Отображаемые сообщения можно легко настроить на сервере, просто добавив ключ / свойство error_msg.Это облегчит работу с такими вещами, как перевод, а также сделает код более гибким.Я включил возможность отображения сообщения отладки в режиме отладки, поэтому во время разработки легко определить, в чем заключалась ошибка (против общего пользовательского сообщения).

Массив, закодированный в формате JSON, должен выглядеть примерно так:

array(
   status => the status using the constants in AJAX
   error_msg => message to be displayed the user at the top of the page
   debug_msg => message to be displayed in debug mode
   html => the html to display
   ... any other data for that request
)

Ниже приведен код обработки ошибки:

// setup the cl4 object and the debug flag
// these are typically else where and cl4 has other stuff in it
var cl4 = {};
var cl4_in_debug = TRUE; // probably default to false, but for this makes it easier to test

cl4.default_error_msg = 'There was a error loading some of the content on this page.<br>Try reloading the page or contacting an administrator.';

/**
* attach an AJAX error hander to the ajax_error element
*/
$('#ajax_errors').ajaxError(function() {
    cl4.add_ajax_error(cl4.default_error_msg);
});

/**
* Call within a ajax success function to deal with the response of an ajax call
*/
cl4.process_ajax = function(return_data) {
    if (typeof return_data != 'object' || return_data === null) {
        cl4.add_default_ajax_error(return_data);
        return false;
    }

    if (cl4.in_debug && typeof return_data.debug_msg != 'undefined'/* && return_data.debug_msg != ''*/) {
        cl4.add_ajax_error(return_data.debug_msg);
    }

    // check to see if we've received the status, because we need it for the rest
    if (typeof return_data.status == 'undefined') {
        return;
    }

    switch (return_data.status) {
        // successful
        case 1 :
            return true;
            break;
        // not logged in
        case 2 :
            cl4.add_default_ajax_error(return_data, 'You are no longer logged in. <a href="/login">Click here to login.</a>');
            return false;
            break;
        // timed out
        case 3 :
            cl4.add_default_ajax_error(return_data, 'Your login has timed out. To continue using your current login, <a href="/login/timedout">click here to enter your password.</a>');
            return false;
            break;
        // not allowed (permissions)
        case 4 :
            cl4.add_default_ajax_error(return_data, 'You do not have the necessary permissions to access some of the functionality on this page.');
            return false;
            break;
        // unknown error
        case 0 :
        default :
            cl4.add_default_ajax_error(return_data);
            return false;
    }
};

/**
* ajax error function, will show a red div at the top of the page if there is a problem with any of the ajax on the page
*/
cl4.add_ajax_error = function(error) {
    $('#ajax_errors').append('<div>' + error + '</div>');
    $('#ajax_errors div').click(function() {
        $(this).slideUp(function() {
            $(this).remove();
        });
    }).slideDown();
};

/**
* Adds a default message if there is no error_msg in the return_data object
*/
cl4.add_default_ajax_error = function(return_data, default_msg) {
    if (arguments.length == 1) {
        default_msg = cl4.default_error_msg;
    }

    if (return_data !== null && typeof return_data == 'object' && typeof return_data.error_msg != 'undefined' && return_data.error_msg != '') {
        cl4.add_ajax_error(return_data.error_msg);
    } else {
        cl4.add_ajax_error(default_msg);
    }
};

Есть мысли по этому поводу?Есть ли лучший метод?Я не нашел много информации о «ошибках» AJAX, кроме данных, которые не могут быть проанализированы, или 404 (или подобных) ошибок.Кроме того, есть ли лучший способ справиться с этими типами ошибок в JQuery.(Я пытался использовать обработчики успеха, но, похоже, все они запускаются после обработчика успеха для текущего запроса.)

Извините за объем кода ... Хотелось бы, чтобы он был короче, но

Кстати, я хотел установить это как вики сообщества, но у меня почему-то нет флажка.

1 Ответ

1 голос
/ 18 марта 2011

Было бы намного чище, если бы ваша функция проверки возвратила логическое значение, определяющее, должен ли обработчик продолжать выполнение или нет, чтобы вы могли сделать что-то подобное:

$.getJSON('/path/to/page?c_ajax=1', function(return_data) {
    if(!cl4.process_ajax(return_data)) return;
    $('#div').html(return_data.html);
});

Конечно, вы также можете очистить свой divв блоке if - но я думаю, что пример довольно хорошо показывает мои намерения (не писать код, связанный с основной проверкой ошибок, в самом обработчике, если это можно сделать в самой программе проверки ошибок).

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