rozważ ten scenariusz do walidacji:
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.
}
}
Mój problem polega na tym, że blok if jest wykonywany przed zakończeniem pętli. Spodziewałem się, że ciało programu validateForm
będzie wykonywane synchronicznie, ale wygląda na to, że each()
funkcja jQuery jest wykonywana asynchronicznie. Czy mam rację? Dlaczego to nie działa?
jquery
asynchronous
Saeed Neamati
źródło
źródło
each
jest synchroniczny, ale kod wewnątrz może nie być ...each
sama jest przetwarzana synchronicznie. Czy rozpoczynasz jakąś własną operację asynchroniczną z wnętrza pętli?Odpowiedzi:
Tak,
each
metoda jQuery jest synchroniczna. Prawie WSZYSTKIE JavaScript są synchroniczne. Jedynymi wyjątkami są AJAX, timery (setTimeout
isetInterval
) oraz HTML5 Web Workers.Twój problem jest prawdopodobnie gdzieś w kodzie.
źródło
jQuery
jest czysto biblioteką javascript. Z wyjątkiemajax
,setTimeout
isetInterval
nie ma nic, co można wykonywane asynchronicznieJavaScript
. Więceach
jest zdecydowanie wykonywane synchronicznie. Zdecydowanie weach
kodzie blokowym jest błąd js . Powinieneś przejrzeć konsolę pod kątem jakichkolwiek błędów.Alternatywnie możesz rzucić okiem na kolejkę jQuery, aby wykonać dowolną funkcję w kolejce. Zapewni to, że funkcja umieszczona w kolejce zostanie wykonana dopiero po zakończeniu poprzedniego wykonywania kodu.
źródło
Innym powodem, dla którego warto zadać to pytanie, byłoby to, że .each po prostu zatrzyma iterację, gdy funkcja (.each ()) zwróci fałsz, a do przekazania informacji „return false” należy użyć dodatkowej zmiennej.
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'); }
źródło
U mnie działa asynchronicznie. Jeśli działa, zsynchronizuj, dlaczego działa tak:
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 });
źródło
return false
in.each()
function przerywa tylko pętlę, a pozostały kod poza pętlą nadal jest wykonywany. Więc ustaw flagę w.each()
pętli i sprawdź ją poza pętlą.źródło
Taki sam problem. Więc naprawiam w ten sposób
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; } } }
źródło
Tak to robię
function getAllEventsIndexFromId(id) { var a; $.each(allEvents, function(i, val) { if (val.id == id) { a=i; } }); return a; }
źródło
Miałem ten sam problem. mój $ .each znajdował się w funkcji sukcesu wywołania ajax. Zrobiłem moje wywołanie Ajax synchronicznie, dodając
async: false
i zadziałało.źródło
Metoda jQuery.each zapętla się synchronicznie, ale nie można zagwarantować, że przejdzie przez elementy w określonej kolejności.
źródło