如何在每个循环中等待所有回调
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
黑客攻击。
我的单元格上有不同的验证器。当一个单元格正在验证时,我需要重新验证其组中的其他单元格。验证在 '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
黑客攻击。