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 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 each()
fonction jQuery soit exécutée de manière asynchrone. Ai-je raison? Pourquoi ça ne marche pas?
jquery
asynchronous
Saeed Neamati
la source
la source
each
est synchrone, mais le code à l'intérieur n'est peut-être pas ...each
lui-même est traité de manière synchrone. Lancez-vous votre propre opération asynchrone depuis l'intérieur de la boucle?Réponses:
Oui, la
each
méthode jQuery est synchrone. Presque TOUT JavaScript est synchrone. Les seules exceptions sont AJAX, les minuteries (setTimeout
etsetInterval
) et les Web Workers HTML5.Votre problème se situe probablement ailleurs dans votre code.
la source
jQuery
est purement une bibliothèque javascript. Saufajax
,setTimeout
etsetInterval
il n'y a rien qui puisse s'exécuter de manière asynchrone dansJavaScript
. Donceach
est définitivement exécuté de manière synchrone. Il y a certainement une erreur js dans leeach
code de bloc. Vous devriez jeter un oeil dans la console pour toute erreur.Vous pouvez également jeter un œil à la file d' attente jQuery pour exécuter n'importe quelle 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.
la source
Une autre raison de se poser cette question serait que .each arrêtera simplement l'itération lorsque la fonction (.each ()) retourne false, et qu'une variable supplémentaire doit être utilisée pour transmettre les informations "return false".
la source
Pour moi, cela fonctionne comme asynchrone. Si cela fonctionne synchronisé, pourquoi cela fonctionne comme ça:
la source
return false
in.each()
function rompt la boucle uniquement, et le code restant en dehors de la boucle s'exécute toujours. Mettez donc un drapeau en.each()
boucle et vérifiez-le en dehors de la boucle.la source
Même problème. Alors je répare comme ça
la source
C'est comme ça que je fais
la source
J'ai eu le même problème. mon $ .each était dans la fonction de succès de l'appel ajax. J'ai rendu mon appel ajax synchrone en ajoutant
async: false
et cela a fonctionné.la source
La méthode jQuery.each effectue une boucle de manière synchrone, mais vous ne pouvez pas garantir qu'elle parcourra les éléments dans un ordre spécifique.
la source