2009-03-10 6 views
2

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

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

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

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

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) { 
... 

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

ответ

2

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

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

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

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

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

Смежные вопросы