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

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

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

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

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

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-запросов для проверки единой формы? Может быть, он должен быть объединен с одним запросом, и после этого мы будем выполнять все действия по проверке на стороне сервера? Как я должен рефакторинг этого кода?

1 Ответ

2 голосов
/ 22 марта 2009

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

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

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

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

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

...