it-swarm.it

La funzione "each ()" di jQuery è sincrona?

considerare questo scenario per la convalida:

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

Ora, il mio problema è che il blocco if viene eseguito prima che i loop siano terminati. Mi aspettavo che il corpo di validateForm fosse eseguito in modo sincrono, ma sembra che la funzione jQuery each() venga eseguita in modo asincrono. Ho ragione? Perché questo non funziona?

124
Saeed Neamati

Sì, il metodo jQuery each è sincrono. Quasi TUTTO JavaScript è sincrono. Le uniche eccezioni sono AJAX, timer (setTimeout e setInterval) e HTML5 Web Workers.
Il tuo problema è probabilmente da qualche altra parte nel tuo codice.

149
Abraham

jQuery è puramente una libreria javascript. Tranne ajax, setTimeout e setInterval non c'è nulla che possa essere eseguito in modo asincrono in JavaScript. Quindi each viene sicuramente eseguito in modo sincrono. C'è sicuramente qualche errore js nel codice di blocco each. Dovresti dare un'occhiata nella console per eventuali errori.

In alternativa puoi dare un'occhiata a jQuery coda per eseguire qualsiasi funzione nella coda. Ciò assicurerà che la funzione in coda venga eseguita solo al termine dell'esecuzione del codice precedente.

7
ShankarSangoli

Un altro motivo per porre questa domanda sarebbe che .each interromperà semplicemente l'iterazione quando la funzione (.each ()) restituisce false e una variabile aggiuntiva deve essere utilizzata per passare le informazioni "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');
}
4
Morg.

Ecco come lo faccio

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

return false Nella funzione .each() interrompe solo il ciclo e il codice rimanente all'esterno del ciclo viene comunque eseguito. Quindi imposta un flag in .each() loop e controllalo al di fuori del loop.

1
M Hussain

Per me funziona come asincrono. Se funziona sincronizzato, perché funziona così:

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

Stesso problema. Quindi aggiusto in questo modo

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
user3027521

Ho avuto lo stesso problema. il mio $ .each era all'interno della funzione di successo della chiamata Ajax. ho reso la mia chiamata ajax sincrona aggiungendo async: false e ha funzionato.

0
Nilkamal Gotarne