我正在对表单数据进行验证,这样当有人点击提交按钮时,它首先检查表单的内容。许多字段(可能为零,可能不止一个,取决于页面)具有独特代码之类的事情,这些代码需要先与服务器进行检查。我正在对服务器运行一个异步请求,该请求只响应每个字段的'ok
'或'taken
'。如果任何字段有错误,则页面不提交。jQuery AJAX:收集多个异步结果
一方面,这应该是异步的:它应该继续验证其余的表单字段,而该请求处于关闭状态,包括触发其他请求。如果通话是同步进行的,那么它会明显减慢后面字段的反馈速度。
另一方面,我想要确保所有的验证请求已经返回(或超时),然后才对validate()
方法回复“是”或“否”,并允许提交进行与否。因此,如果有两个字段需要验证,那么validate()
方法应该关闭这两个AJAX请求,处理剩余的字段,然后等到这两个请求返回后再返回。
我可以用一些丑陋的家庭烘焙解决方案(可能涉及代表正在进行中的请求的随机ID数组)来实现这一点,但在我做之前,有任何内置函数,插件或标准技术,我应该改用?
澄清
我想我需要的是一个方法之前使代码等待结果从一个或多个异步请求。这与回调不同,因为方法的结果取决于请求的结果。它与同步请求不同,因为它们可能不止一个。
我使用这个在提交前检查形式:
$("form").submit(function() {
return validate($(this));
});
如果validate()
方法返回false,那么表单不提交。 validate()
hilights任何不被接受的字段。对于一般的领域,validate()
看起来是这样的(大大简化版本,没有反馈):
function validate(form) {
resetWarnings(form);
var ok = true;
// required fields
form.find("input.required").each(function() {
var field = $(this);
if (field.val() === "") {
ok = false;
}
return this; // meaningless in this case but a good habit to keep
});
// fields that matches a pattern
form.find("input.pattern").each(function() {
var field = $(this);
var pattern = field.data("pattern");
if (!field.val().match(pattern)) {
ok = false;
}
return this;
});
// various other rules for other sorts of field
...
return ok;
}
对于AJAX领域它更像是这样的:
form.find("input.lookup").each(function() {
var field = $(this);
var url = field.data("lookup");
$.ajax({
url: url,
data: { code: field.val() },
success: function (result) {
if (result === "taken") {
ok = false;
}
}
}
});
但当然,validate()
已经前完成成功的方法被称为。所以如果我可以在返回前等待ajax完成(成功或者错误),我可以得到正确的结果并停止提交的表单。如果我使ajax同步,那么整个方法会停止,直到完成为止,这是错误的。
进一步思考
给了JavaScript的线程模型(这是说完全没有),就是我所要求的技术上是不可能的?
它不是一系列相同的唯一字段,但表单上的多个字段可能需要服务器端检查 - 在不同的URL上针对不同的检查。实际上,多位并不重要 - 它使validate()方法等待异步结果。我强调可能有多个字段的唯一原因是,使单个同步呼叫不是一个有效的答案。 – 2009-11-04 19:36:59
请参阅说明。 – 2009-11-04 20:07:24
我不确定我要求什么是可能的。在用户完成表单时验证字段可能最终成为唯一的方法。 – 2009-11-04 20:21:07