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

How to wait all callbacks in each-loop

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

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

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

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

之后

更好的设计是将验证函数附加到元素:

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

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

这将使您能够以明确定义的顺序进行同步验证,而无需任何事件或 validated 黑客攻击。