144 votes

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, si le bloc if est exécuté avant que les boucles ne soient terminées. 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?

172voto

Abraham Points 4547

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

9voto

ShankarSangoli Points 45345

jQuery est purement une bibliothèque javascript. Sauf ajax, setTimeout et setInterval il n'y a rien qui peut exécuté en mode asynchrone en JavaScript. Donc, each est certainement exécuté de manière synchrone. Il y a certainement des js erreur à l'intérieur de l' each bloc de code. Vous devriez jeter un oeil dans la console d'erreurs éventuelles.

Alternativement, vous pouvez prendre un coup d'oeil à jQuery file d'attente pour exécuter une fonction dans la file d'attente. Ce sera assurez-vous que la file d'attente de la fonction sera exécutée que lorsque la précédente exécution de code est complet.

8voto

Morg. Points 520

Une autre raison de poser cette question serait que .chacun sera tout simplement arrêter l'itération lors de la (.chacun() ) la fonction retourne false, et une variable supplémentaire doit être utilisé pour transmettre le "return false" de l'information.

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

1voto

user3027521 Points 1

Même problème. J'ai donc corrigé 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;
        }
    }

}

-10voto

Chris Pietschmann Points 13397

Le jQuery.chaque méthode boucles de façon Synchrone, mais vous ne pouvez pas garantir que ça va faire une boucle par les éléments dans un ordre particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X