Удобочитаемость вложенных функций обратного вызова AJAX

Пожалуйста, помогите мне реорганизовать этот код Javascript. Существует большая форма для запланированной отправки сообщений (дата отправки, тип повторения, дата окончания/количество, система кредитов - необходимо подсчитать общую стоимость запланированного плана отправки во время выполнения). Я пишу валидатор Javascript для этой формы.

Существует алгоритм проверки 1) проверьте, не находится ли время даты отправки в прошлом моменте 2) проверьте, больше ли время поля «конец по дате», чем время первой даты отправки 3) проверьте общую стоимость плана расписания

(там около 6 шагов, но я просто пишу здесь их 3 - думаю будет достаточно для понимания задачи)

Кнопка «Сохранить запланированный план» имеет прослушиватель javascript в событии «щелчок». Этот слушатель вызывает эту функцию:

ScheduledValidator.checkIfSendDateTimeIsNotInPast(params, form);

Вот его декларация:

ScheduledValidator.checkIfSendDateTimeIsNotInPast = function (params, form) {
    var conn = new Ext.data.Connection();

    conn.request({
        url: CONST.BASE_URL + 'url',
        params: params,
        callback: function (options, success, response) {
            response = Ext.util.JSON.decode(response.responseText);
            if (response.success == false) {
                // display error messages
            } else { 
                ScheduledValidator.checkIfEndDateIsGreaterThatSendDate(params, form);
            }
        }
    });
}

У нас есть вложенный запрос позже:

ScheduledValidator.checkIfEndDateIsGreaterThatSendDate = function (params, form) {
var conn = new Ext.data.Connection();

conn.request({
    url: CONST.BASE_URL + 'url2',
    params: params,
    messageForm: form,
    callback: function (options, success, response) {
        response = Ext.util.JSON.decode(response.responseText);
        if (response.success == false) {
            // display error messages
        } else {
            ScheduledValidator.validateTotalCost(params, form);
        }
    }
});
}

и еще один здесь:

ScheduledValidator.validateTotalCost = function (params, form) {
...

Мне не нравится в этом подходе то, что с первого взгляда сложно понять алгоритм. Может быть, нехорошо делать много (около 6) вложенных запросов AJAX для проверки одной формы? Может быть, его следует объединить в один запрос, и после этого мы будем выполнять все действия по проверке на стороне сервера? Как мне реорганизовать этот код?


person Nikita Fedyashev    schedule 10.03.2009    source источник


Ответы (1)


Я предлагаю вам уменьшить масштаб и оценить, как работает процесс формы и взаимодействие с пользователем, прежде чем рефакторить свой код.

Например, необходимо ли немедленно давать обратную связь пользователю при вводе даты? Можно ли подождать, пока она заполнит форму? Если это так, вы можете просто использовать обычную публикацию формы, проверить отправку на стороне сервера и отправить отзыв.

Если нет, и опыт требует немедленной обратной связи, вы можете захотеть создать общую оболочку вокруг своей реализации для обработки проверки формы. Это можно сделать вручную или поискать в Google механизмы проверки форм, которые позволяют определять конкретные URL-адреса и обратные вызовы в соответствии с вашими потребностями.

Третьим вариантом может быть выполнение проверки на стороне клиента без обращения к серверу. Определите, может ли ваша логика быть реализована в Javascript (скорее всего, если она связана с вычислением даты, это не должно быть слишком сложно) и попробуйте добавить слой, который сделает это за вас, чтобы вам не нужно было связываться с сервером в первое место. Бонус: в зависимости от того, насколько быстро ваш код на стороне сервера отвечает, это может улучшить взаимодействие с пользователем (однако помните, что проверка на стороне сервера по-прежнему обязательна!).

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

person Rahul    schedule 22.03.2009