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


131

考虑此方案以进行验证:

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


2
验证码是什么样的?each是同步的,但是里面的代码可能不是...
lonesomeday

1
each本身是同步处理的。您是从循环内部开始自己的异步操作吗?
乔恩

3
这里有类似的问题..您如何解决的?
sakthig

很久以前,我不记得了。但是我知道答案对我有帮助。因此,我可能在验证代码中使用了异步代码块(例如尝试使用ajax请求验证地址)。
Saeed Neamati 2012年

1
嗯..我这样解决了..我在每个函数中都执行“ return false”,但是我认为..现在正在每个函数中维护一个标志,并在验证结束时返回该标志..
sakthig

Answers:


158

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


7

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

另外,您可以查看jQuery 队列以执行队列中的任何功能。这将确保仅在上一个代码执行完成时才执行排队的函数。


7
也有

6

提出该问题的另一个原因是,当(.each())函数返回false时,.each将仅停止迭代,并且必须使用附加变量来传递“ 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');
}

2

对我来说,它就像异步的。如果它能同步,为什么会这样:

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

2

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


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

}

1

那就是我的做法

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


-9

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


21
不,它将始终按照它们在文档中出现的顺序遍历它们。
亚伯拉罕

3
这取决于您要迭代的内容。每个都保证在数组上执行索引顺序,但不保证对象(应该很明显)。
Deadron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.