jQuery“each()”函数是否同步?

考虑这种情况来validation:

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()函数asynchronous执行。 我对吗? 为什么这不起作用?

是的,jQuery的each方法都是同步的。 几乎所有的JavaScript都是同步的。 唯一的例外是AJAX,定时器( setTimeoutsetInterval )和HTML5 Web Workers。
您的问题可能在您的代码中的其他地方。

jQuery纯粹是一个JavaScript库。 除了ajaxsetTimeoutsetInterval之外,没有什么东西可以在JavaScriptasynchronous执行。 所以each都是同步执行的。 each块代码中肯定存在一些js错误。 你应该看看在控制台中的任何错误。

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

另一个要问这个问题的原因是,每当(.each())函数返回false时,每个函数都会停止迭代,并且必须使用一个附加variables来传递“返回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'); } 

对我来说,它就像asynchronous。 如果它同步工作,为什么它的工作原理是这样的:

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

同样的问题。 所以我解决这个问题

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

jQuery.each方法同步循环,但是不能保证它会以任何特定的顺序遍历项目。