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

标签 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/field 会将错误附加到表单字段。当您第一次运行它时出现错误,但一切都运行得如此之快,将发送一个 ajax 请求以保存表单。第二次运行该表单时,该函数会正确停止,因为已对错误类别进行计数。

有解决办法吗?

最佳答案

如果验证是异步的

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

如果验证是同步

以上假定验证涉及某种异步事件。它看起来不像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);
}

setTimeout0 参数表示“在零毫秒后给我回电话”,但实际上没有浏览器会这样做——通常是在 4-10 毫秒后.重点是它是异步的,在浏览器有机会 catch 并重新调用 JavaScript 层之后。

不过要小心确保进行验证的事情是同步进行的。如果不是,如果它正在执行任何异步操作,那么上面的代码会在您的代码中引入竞争条件,有时它似乎可以工作,而其他时候则不会工作。比赛条件会咬你,所以仔细检查。 :-)

关于JavaScript 执行得太快而无法捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286025/

相关文章:

jquery - 单击时替换图像

javascript - 仅在编辑模式-Sharepoint 页面上执行的脚本

javascript - 获取 Iframe 的高度和 resize 事件

javascript - 如何将 API 中的 id 存储在变量中,以便单击时可以使用它来查找信息?

javascript - 如何更正我的代码以返回所有匹配的城市单独的 div?

javascript - 是否可以缩短我编写的这段 JavaScript 代码

php - 通过 JSON、JQuery、PHP 传递特定信息

JavaScript (w/jQuery) - 在悬停时增加一个元素以填充容器,当被其他元素包围时

javascript - 如何 stub 未直接传递给调用函数的函数?

javascript - HTML5 postMessage 返回未定义