2

请帮我重构这个 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 查询来验证单个表单可能不好?也许应该将它合并到单个请求中,然后我们将在服务器端进行所有验证活动?我应该如何重构这段代码?

4

1 回答 1

2

我建议您在重构代码之前缩小并评估表单流程和用户体验的工作方式。

例如,输入日期时是否需要立即反馈给用户?可以等到她填完表格吗?如果是这样,您可以只使用常规表单发布,验证提交服务器端,并返回反馈。

如果不是,并且体验需要立即反馈,您可能需要考虑围绕您的实现创建一个通用包装器来处理表单验证。这可以手动完成,或者您可以在 Google 上查看表单验证机制,允许您根据需要定义特定的 URL 和回调。

第三种选择可能是在不联系服务器的情况下进行验证客户端。确定您的逻辑是否可以在 Javascript 中完成(很可能,如果它涉及日期计算,这应该不会太难)并尝试添加一个为您执行此操作的层,这样您就不需要联系服务器第一名。奖励:取决于服务器端代码的响应速度,这实际上可以改善用户体验(但是,请记住,服务器端验证仍然是必须的!)。

从您在问题中给出的示例用例中,听起来我以前的建议适用——也就是说,并不完全有必要如此直接地反馈您是否正确填写了表格。如果我对您的情况的理解是正确的,我建议通过删除 AJAX 调用并将其作为正常形式工作来开始重构过程,然后在工作后添加仅客户端验证。

于 2009-03-22T00:11:07.890 回答