JQuery“ each()”函数是同步的吗?

考虑这种情况以验证:

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.
}
}

现在,我的问题是,如果块在循环结束之前就被执行了。我希望 validateForm的主体能够同步执行,但是看起来 jQueryeach()函数是异步执行的。我说的对吗?为什么这样不行?

86556 次浏览

是的,jQueryeach方法是同步的。几乎所有的 JavaScript 都是同步的。唯一的例外是 AJAX、计时器(setTimeoutsetInterval)和 HTML5WebWorkers。
您的问题可能在代码中的其他地方。

Each 方法同步地循环,但是您不能保证它会以任何特定的顺序遍历这些项。

jQuery纯粹是一个 javascript 库。除了 ajaxsetTimeoutsetInterval之外,在 JavaScript中没有任何东西可以异步执行。所以 each绝对是同步执行的。在 each块代码中肯定有一些 js 错误。您应该在控制台中查看任何错误。

或者,您可以查看 jQuery排队来执行队列中的任何函数。这将确保只有在前面的代码执行完成时才执行排队的函数。

问这个问题的另一个原因是。时,每个都将简单地停止迭代。Each ()函数返回 false,必须使用一个附加变量来传递“ return 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 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;
}

对我来说,它的工作方式就像是异步的,如果它是同步的,为什么会这样:

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
});

我也有同样的问题。我的 $。每个都在 Ajax 调用的成功函数中。我通过添加 async: false使我的 ajax 调用同步,并且它工作了。

.each()函数中的 return false仅中断循环,循环外的其余代码仍然执行。因此,在 .each()循环中设置一个标志,并在循环外检查它。