ChatGPT解决这个技术问题 Extra ChatGPT

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

现在,我的问题是, if 块在循环完成之前执行。我希望 validateForm 的主体会同步执行,但似乎 jQuery each() 函数是异步执行的。我对吗?为什么这不起作用?

验证码是什么样的? each 是同步的,但里面的代码可能不是...
each 本身是同步处理的。您是否从循环内部开始自己的一些异步操作?
这里有类似的问题..你是怎么解决的?
很久以前的事了,记不得了。但我知道这些答案对我有帮助。因此,我可能在验证代码中使用了异步代码块(例如尝试使用 ajax 请求验证地址)。
嗯..我这样解决了..我在每个函数内部都在做“return false”我猜这不起作用..现在我在每个函数内部维护一个标志并在验证结束时返回该标志..

A
Abraham

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


S
ShankarSangoli

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

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


也有承诺......只是说:)
M
Morg.

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

T
Tuitx

对我来说,它就像异步一样工作。如果它可以同步工作,为什么它会这样工作:

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

M
M Hussain

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


u
user3027521

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

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

}

S
Sojtin

我就是这样做的

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

N
Nilkamal Gotarne

我遇到过同样的问题。我的 $.each 在 ajax 调用的成功函数中。我通过添加 async: false 使我的 ajax 调用同步并且它有效。


C
Chris Pietschmann

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


不,它总是按照它们在文档中出现的顺序循环遍历它们。
这取决于您要迭代的内容。每个都保证在数组上执行索引顺序,但不保证对象(这应该是显而易见的)。