web-dev-qa-db-fra.com

Est-ce que jQuery "each ()" fonctionne de manière synchrone?

considérez ce scénario pour valider:

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

Maintenant, mon problème est que le bloc if est exécuté avant la fin des boucles. Je m'attendais à ce que le corps de validateForm soit exécuté de manière synchrone, mais il semble que la fonction jQuery each() soit exécutée de manière asynchrone. Ai-je raison? Pourquoi ça ne marche pas?

124
Saeed Neamati

Oui, la méthode jQuery each est synchrone. Presque TOUT le JavaScript est synchrone. Les seules exceptions sont AJAX, les minuteries (setTimeout et setInterval) et les travailleurs Web HTML5.
Votre problème est probablement ailleurs dans votre code.

149
Abraham

jQuery est purement une bibliothèque javascript. Sauf ajax, setTimeout et setInterval, rien ne peut être exécuté de manière asynchrone dans JavaScript. Donc each est définitivement exécuté de manière synchrone. Il y a certainement une erreur js dans le code de bloc each. Vous devriez jeter un coup d'oeil dans la console pour toutes les erreurs.

Sinon, vous pouvez jeter un oeil à jQuery file d'attente pour exécuter toute fonction de la file d'attente. Cela garantira que la fonction en file d'attente ne sera exécutée que lorsque l'exécution du code précédent sera terminée.

7
ShankarSangoli

Une autre raison de poser cette question serait que .each arrêtera simplement l'itération lorsque la fonction (.each ()) renvoie false et qu'une variable supplémentaire doit être utilisée pour transmettre les informations "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.

Thats comment je le fais

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

return false Dans .each() ne rompt que la boucle et le code restant en dehors de la boucle est toujours exécuté. Placez donc un drapeau dans la boucle .each() et vérifiez-le en dehors de la boucle.

1
M Hussain

Pour moi, cela fonctionne comme asynchrone. Si cela fonctionne en synchronisation, pourquoi ça marche comme ça:

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

Même problème. Donc je répare comme ça

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

J'ai eu le même problème. mon $ .each était dans la fonction de succès de l'appel ajax. J'ai fait mon appel ajax synchrone en ajoutant async: false et cela a fonctionné.

0
Nilkamal Gotarne