考虑这种情况进行验证:
function validateForm (validCallback) {
$('#first-name').add($('#last-name')).add($('#address')).each(function () {
// validating fields and adding 'invalid' class to invalid fields.
});
// doing validation this way for almost 50 fields (loop over 50 fields)
if ($('#holder .invalid').length == 0) {
// submitting data here, only when all fields are validated.
}
}
现在,我的问题是, if 块在循环完成之前执行。我希望 validateForm
的主体会同步执行,但似乎 jQuery each()
函数是异步执行的。我对吗?为什么这不起作用?
each
是同步的,但里面的代码可能不是...
each
本身是同步处理的。您是否从循环内部开始自己的一些异步操作?
是的,jQuery each
方法是同步的。几乎所有的 JavaScript 都是同步的。唯一的例外是 AJAX、计时器(setTimeout
和 setInterval
)和 HTML5 Web Workers。
您的问题可能出在代码的其他地方。
jQuery
纯粹是一个 JavaScript 库。除了 ajax
、setTimeout
和 setInterval
,没有什么可以在 JavaScript
中异步执行。所以 each
肯定是同步执行的。 each
块代码中肯定有一些 js 错误。您应该在控制台中查看任何错误。
或者,您可以查看 jQuery queue 来执行队列中的任何函数。这将确保仅在前一个代码执行完成时才执行排队的函数。
提出这个问题的另一个原因是 .each 将在 (.each() ) 函数返回 false 时简单地停止迭代,并且必须使用附加变量来传递“返回 false”信息。
var all_ok=true;
$(selector).each(function(){
if(!validate($(this))){
all_ok=false; //this tells the outside world something went wrong
return false; //this breaks the .each iterations, returning early
}
});
if(!all_ok){
alert('something went wrong');
}
对我来说,它就像异步一样工作。如果它可以同步工作,为什么它会这样工作:
var newArray = [];
$.each( oldArray, function (index, value){
if($.inArray(value["field"], field) === -1){
newArray.push(value["field"]);
}
}
);
//do something with newArray here doesn't work, newArray is not full yet
$.when.apply($, newArray).then(function() {
//do something with newArray works!! here is full
});
.each()
函数中的 return false
仅中断循环,循环外的剩余代码仍会执行。所以在 .each()
循环中设置一个标志并在循环外检查它。
同样的问题。所以我这样修复
var y = jQuery(this).find(".extra_fields");
for(var j in y)
{
if( typeof y[j] =='object')
{
var check = parseInt(jQuery(y[j]).val());
if(check==0){
jQuery(y[j]).addClass('js_warning');
mes="Bạn vui lòng chọn đầy đủ các thuộc tính cho sản phẩm";
done=false;
eDialog.alert(mes);
return false;
}
}
}
我就是这样做的
function getAllEventsIndexFromId(id) {
var a;
$.each(allEvents, function(i, val) {
if (val.id == id) { a=i; }
});
return a;
}
我遇到过同样的问题。我的 $.each 在 ajax 调用的成功函数中。我通过添加 async: false
使我的 ajax 调用同步并且它有效。
jQuery.each 方法同步循环,但您不能保证它会以任何特定顺序循环遍历项目。
不定期副业成功案例分享