JavaScript执行得太快,无法捕获错误

时间:2010-11-26 14:17:35

标签: javascript jquery

我正在使用Peter Higgins的pub / sub jQuery插件。我遇到了JavaScript验证问题。

这是问题的关键......

$.subscribe('/make', function(form_id, fields, path, type) { 
    for (var i=0; i < fields.length; i++) {
        $.publish('/validation/field', [ path+'check_field', $('*[name="'+fields[i]+'"]'), fields ]);
    }

    if ($('#'+form_id+' .error').length > 0) {
        alert('There are errors, please fix the errors before continuing.');
        return;
    }

/ validation /字段会将错误附加到表单字段。当您第一次出现错误但是一切都运行得如此之快时,会发送一个ajax请求来保存表单。第二次运行表单时,由于计算了错误类,函数正确停止。

有解决方法吗?

2 个答案:

答案 0 :(得分:1)

如果验证是异步的

...你通常采用的方法是使用回调。在这种情况下,您将寻找由验证定义的回调,该回调告诉您验证何时完成,此时您可以使用您的代码来计算产生的错误。

如果验证是同步

以上假设验证涉及某种异步活动。它看起来不像that pub/sub plugin提供任何异步性,因此这将取决于/validation/field的订阅者所做的事情。如果它执行了ajax调用或setTimeout或类似调用,那么您将需要回调。

如果/validation/field订阅者同步验证 ,那么我很惊讶您之后没有正确计算字段的问题。但如果你是,你可以通过给浏览器一点时间来解决它:

$.subscribe('/make', function(form_id, fields, path, type) { 
    for (var i=0; i < fields.length; i++) {
        $.publish('/validation/field', [ path+'check_field', $('*[name="'+fields[i]+'"]'), fields ]);
    }

    // Check results *after* giving the browser a moment to breathe:
    setTimeout(function() {
        if ($('#'+form_id+' .error').length > 0) {
            alert('There are errors, please fix the errors before continuing.');
            return;
        }
        // (...your code left off here, but I'm guessing the rest of the
        // function would also need to be within this new anonymous function...)
    }, 0);
}

0 setTimeout参数意味着“在零毫秒内回复”,但实际上没有浏览器会这样做 - 通常是4-10毫秒之后。重点是,在浏览器有机会赶上并重新调用JavaScript层之后, 将是异步的。

小心但,请确定表明正在进行验证的事情是同步进行的。如果不是,如果它正在执行任何异步操作,那么上面会在您的代码中引入竞争条件,有时它似乎有效,有时则不起作用。比赛条件会咬你,所以仔细检查。 : - )

答案 1 :(得分:1)

订阅使用ajax来调用服务器吗?

如果那么那就是你的问题,因为ajax是异端的。

订阅方法然后在发送调用后立即退出,并在ajax响应上调用该函数。

这意味着订阅之后的任何代码都可能在ajax请求完成之前被调用,并且还没有任何错误。

然后,您需要将订阅调用中的任何代码移动到回调方法中,以确保在ajax调用之后调用它。

要阻止任何其他操作,您可以设置globalvariable,例如。 validating = true,并有任何其他代码检查。