jQuery AJAX:收集多个异步结果

Mar*_*ing 5 ajax jquery asynchronous

我正在对表单数据进行验证,这样当有人点击提交按钮时,它会首先检查表单的内容.许多字段(可能为零,可能不止一个,具体取决于页面)具有类似于需要先与服务器进行检查的唯一代码.我正在向服务器运行异步请求,它只是对每个字段响应' ok'或' taken'.如果任何字段有错误,则页面不会提交.

一方面,这应该是异步的:它应该在该请求处于关闭处理时继续验证其余的表单字段,包括触发其他请求.如果同步进行呼叫,则会明显减慢后续字段的反馈速度.

另一方面,我想确保所有验证请求都返回(或超时),然后才对validate()方法作出"是"或"否" ,并允许提交继续进行.因此,如果有两个字段需要验证,那么该validate()方法应该触发这两个AJAX请求,处理其余字段,然后等到这两个请求返回后再返回.

我可以通过一些丑陋的自制解决方案来实现这一点(可能涉及一组代表正在进行的请求的随机ID),但在我做之前是否有任何内置函数,插件或标准技术我应该使用?


澄清

我认为我需要的是在继续使用方法之前使代码等待来自一个或多个异步请求的结果.这与回调不同,因为方法的结果取决于请求的结果.它与同步请求不同,因为它们可能不止一个.

我在提交之前使用它来检查表单:

$("form").submit(function () {
    return validate($(this));
});
Run Code Online (Sandbox Code Playgroud)

如果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;
}
Run Code Online (Sandbox Code Playgroud)

对于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;
                }
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

但当然,validate()在调用成功方法之前已经完成了.因此,如果我可以让它等到ajax完成(成功或错误)返回之前,我可以得到正确的结果并停止提交表单.如果我使ajax同步,那么整个方法会停止,直到完成,这是错误的.


进一步思考

鉴于Javascript的线程模型(也就是说根本没有),我在技术上要求的是什么?

Mik*_*ike 1

如果我理解正确,您想要检查在表单中输入的值 (1..*) 是否唯一,一旦用户在表单上执行发布之前点击提交按钮。如果是这种情况,我将创建一个包含字段和值的 JSON 数组并一次性发送所有内容 - 这样您只需等待一个响应。使用 jQuery 'each' 函数和 jQuery ajax 应该很容易。

然后,您可以在发布表格之前检查单个结果。

这可能是不言而喻的,但请确保在发布后在服务器端重复相同的验证,以避免与其他用户的竞争条件。

您可以在用户填写表单时验证各个字段,并存储结果,但这会明显更加繁琐(出于可扩展性原因,您应该考虑带宽),并且服务器端验证失败的可能性更大。