Чи синхронізована функція jQuery “every ()”?


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буде виконуватися синхронно, але, схоже, each()функція jQuery виконуваться асинхронно. Маю рацію? Чому це не працює?


2
Як виглядає код перевірки? eachсинхронний, але код всередині може бути не ...
lonesomeday

1
eachсама обробляється синхронно. Ви починаєте якусь власну операцію з асинхронізації зсередини циклу?
Jon

3
подібна проблема тут .. як ти її вирішив?
sakthig

Це давно, я не можу згадати. Але я знаю, що відповіді мені допомогли. Отже, я міг би використовувати блоки асинхронних кодів у своєму коді перевірки (наприклад, намагаючись перевірити адресу за допомогою запиту ajax).
Саїд Неаматі

1
Хм .. я вирішив це таким чином .. Я робив "повернення помилок" всередині кожної функції, яка не працювала, я думаю .. тепер я підтримую прапор всередині цієї кожної функції і повертаю цей прапор в кінці перевірки ..
sakthig

Відповіді:


158

Так, eachметод jQuery є синхронним. Майже ВСІ JavaScript є синхронним. Винятки становлять лише AJAX, таймери ( setTimeoutі setInterval) та веб-працівники HTML5.
Можливо, ваша проблема десь ще в коді.


7

jQueryє суто бібліотекою javascript. За винятком ajax, setTimeoutі setIntervalнемає нічого, що може асинхронно виконати в JavaScript. Так eachбезумовно виконується синхронно. Однозначно є деяка помилка js всередині eachблокового коду. Ви можете подивитися в консолі на предмет будь-яких помилок.

Крім того, ви можете подивитися в черзі jQuery, щоб виконати будь-яку функцію в черзі. Це забезпечить виконання функції черги, яка виконується лише тоді, коли завершиться виконання попереднього коду.


7
є також обіцянки ... просто кажу :)

6

Ще одна причина, щоб задати це питання, полягала б у тому, що .each просто зупинить ітерацію, коли функція (.each ()) поверне помилкову, і для передачі інформації "повернути помилкову" потрібно використовувати додаткову змінну.

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 falseу .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;
 }

0

У мене було те саме питання. мій $ .each був у функції успіху виклику Ajax. Я зробив свій дзвінок Ajax синхронним шляхом додавання, async: falseі він працював.


-9

Метод jQuery.each циклічно синхронізується, але ви не можете гарантувати, що він буде проходити через елементи в будь-якому конкретному порядку.


21
Ні, це завжди буде проходити через них у порядку, в якому вони відображаються в документі.
Авраам

3
Це залежить від того, над чим ви повторюєте. Кожна гарантія виконання замовлення в індексах на масиві, але не дає гарантій для об'єкта (що має бути очевидним).
Дедрон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.