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?
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.
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.
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');
}
Thats comment je le fais
function getAllEventsIndexFromId(id) {
var a;
$.each(allEvents, function(i, val) {
if (val.id == id) { a=i; }
});
return a;
}
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.
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
});
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;
}
}
}
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é.