如何在每个循环中等待所有回调

时间:2015-01-19 12:25:30

标签: javascript jquery validation

我的单元格上有不同的验证器。当一个单元格正在验证时,我需要重新验证其组中的其他单元格。验证会导致模糊'事件所以我必须触发'模糊'组中所有单元格的事件:

element.attr('validated', true);
var validityGroup = getValidityGroupElements();
validityGroup.each(function() {
  $(this).blur();
});
element.attr('validated', false);

此处element是当前单元格,函数getValidityGroupElements()为我提供了当前组whith validated="false"属性的元素数组。我设置此属性是为了避免无限循环,因为每个单元格将验证其中的所有单元格等等。但问题是:如何等待在.each循环中运行的所有回调,并且仅在此之后将当前元素的验证属性设置为false

1 个答案:

答案 0 :(得分:1)

您正在滥用blur事件来触发导致问题的验证:在您的浏览器中,"发送blur事件"是同步的(所以事件是立即发送的)但是处理程序当时没有被执行。浏览器只是在堆栈上推送一个事件,然后最终开始执行它们。由于JS不支持并行执行,因此第一个blur事件将在上述代码之后执行 - 即在validated重置为false之后执行。

更好的设计是将验证功能附加到元素:

e.data('validate', function(){...});

blur()和其他任何地方,您现在可以编写:e.data('validate')();来调用验证函数(双括号不是拼写错误 - e.data('validate')返回一个函数)。

这将允许您以明确定义的顺序进行验证并同步,无任何事件或validated黑客。