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

时间:2011-09-10 13:18:22

标签: jquery asynchronous

考虑这种情况进行验证:

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

9 个答案:

答案 0 :(得分:148)

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

答案 1 :(得分:7)

jQuery纯粹是一个javascript库。除ajaxsetTimeoutsetInterval之外,在JavaScript中无法异步执行任何操作。所以each肯定是同步执行的。 each块代码中肯定存在一些js错误。您应该在控制台中查看是否存在任何错误。

或者你可以看一下jQuery queue来执行队列中的任何函数。这将确保仅在先前的代码执行完成时才执行排队功能。

答案 2 :(得分:4)

提出这个问题的另一个原因是.each只会在(.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');
}

答案 3 :(得分:1)

同样的问题。所以我这样修理

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

}

答案 4 :(得分:1)

多数民众赞成我是怎么做的

 function getAllEventsIndexFromId(id) {
    var a;
    $.each(allEvents, function(i, val) {
        if (val.id == id) { a=i; }
    });
    return a;
 }

答案 5 :(得分:1)

对我而言,它就像异步一样。如果它同步工作,为什么它会这样:

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

答案 6 :(得分:1)

return false函数中的

.each()仅中断循环,并且循环外的其余代码仍将执行。因此,请在.each()循环中设置一个标志,并在循环外对其进行检查。

答案 7 :(得分:0)

我有同样的问题。我的$ .each在ajax调用的成功函数内。我通过添加async: false使我的ajax调用同步,并且可以正常工作。

答案 8 :(得分:-9)

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