2011-08-30 3 views
0

J'ai un problème avec Javascript qui exécute les choses dans un ordre qui n'a pas de sens pour moi.Javascript Order Of Execution Problème

Ce qui se passe est la suivante

var bValid = false; 
alert(bValid + " 1"); 
if(validateForm() == TRUE) 
{ 
    $.get("submit_manageUsers.php", 
     {action: sendAct, userID: userID}, 
     function(responseText) 
     { 
      if(responseText == "GOOD") 
      { 
       alert("Update Successful"); 
       bValid = true; 
       alert(bValid + " 2"); 
      } 
      else 
      { 
       alert(responseText + "\n Update Unsuccessful"); 
       bValid = false; 
      } 
     }, 
     "html" 
    );  
    bvalid = true; 
    alert(bValid + " 3"); 
} 
alert(bValid + " 4"); 
if(bValid == true) 
{ 
    //do something 
} 
alert(bValid + " 5"); 

EDIT: ajout d'un peu plus de ce qui se passe réellement dans le cas où il aide, probablement savoir comment je fais les choses!

La sortie du code ci-dessus ressemble à ceci:

faux 1

faux 2

faux 4

faux 5

true 3.

Le problème ici est que le if(bValid == true) i s étant exécuté avant le if(validateForm() == TRUE), cela signifie que bValid est toujours faux.

Pourquoi cette partie du code s'exécute-t-elle avant l'autre partie?

Toute aide à ce sujet est grandement appréciée!

+0

Quelle est la valeur de «VRAI»? – Jimmy

+0

TRUE est ce que la fonction validateForm() devrait renvoyer pour définir la variable bValid sur TRUE. – Adam

+0

Veuillez créer un http://jsfiddle.net/ qui produit cette sortie. Si 'TRUE' n'est pas défini, le code échouera et ne produira plus aucune sortie. Si elle est définie, la sortie sera différente. De mon point de vue, l'ordre de sortie est impossible. –

Répondre

1

Javascript est sensible à la casse. validateForm() renvoie un bool droit? Donc c'est soit vrai ou faux. TRUE est et non le même que vrai.

if (validateForm() == true) { // do something. } 

Je dirais même aller un peu plus loin et utiliser égaux strictes:

if (validateForm() === true) { // do something. } 

En outre, bvalid est pas le même que bValid. À l'avenir, je suggérerais d'utiliser l'un des nombreux outils javascript pour trouver des erreurs de syntaxe (telles que jsfiddle, jslint, jsbin, etc.). Nous faisons tous des erreurs, et parfois ces petits détails simples causent de gros maux de tête. Il n'y a pas de béquille compilateur (comme je l'utilise tous les jours avec C#) pour javascript bien que YUI et Google aient des outils de vérification de syntaxe pour les aider.

Google - http://code.google.com/closure/

Yahoo! - http://developer.yahoo.com/yui/

Après plus d'informations ont été fournies dans la question initiale -

Vous faites un appel asynchrone à votre page PHP qui peut prendre 1 seconde ou 30 secondes.

http://api.jquery.com/jQuery.ajax/

JQuery Ajax (qui alimente la fonction .get) est asynchrone par défaut. Cependant, vous pouvez le remplacer et le rendre synchrone.

+0

Je souhaitais qu'il s'agisse d'une erreur de syntaxe, mais je me suis précipité en tapant la question, toutes les variables sont orthographiées de la même manière dans le code réel, je pense que cela concerne le .get jQuery et comment ça fonctionne, mais pas tout à fait sûr comment ça marche! – Adam

+0

Je veux voir cette fonction validateForm(). –

+0

Vous effectuez un appel asynchrone sur votre page PHP qui peut prendre 1 seconde ou 30 secondes. –

0

Vous n'avez pas besoin d'indiquer true ou false dans ces conditions.Essayez quelque chose comme ça et voir si elle résout votre problème:

var bValid = false; 
alert(bValid + " 1"); 

if (validateForm()) { 
    bvalid = true; 
    alert(bValid + " 2"); 
} 

alert(bValid + " 3"); 
if (bValid) { 
    //do something 
} 

alert(bValid + " 4"); 
+0

non, n'a pas aidé mais merci – Adam

0
var bValid = false; 
alert(bValid + " 1"); 

if(validateForm() == TRUE){ 
    bvalid = true; 
    alert(bValid + " 2"); 
} 
alert(bValid + " 3"); 

setTimeout(function() { // Continue le script après l'insertion du html 
    if(bValid == true){ 
     //do something 
    } 
    alert(bValid + " 4"); 
}, 0); 

De cette façon, la première partie de votre script doit être fait avant de commencer la deuxième validation. Espérons que cette aide.

0

$.get est asynchrone. Cela signifie que vous envoyez le message, que vous raccrochez le téléphone et que vous attendez que jQuery vous rappelle lorsque c'est terminé avec submit_manageUsers.php. Les étapes 3 et 4 sont terminées après le raccrochage du téléphone, mais l'étape 2 ne se produit qu'après l'appel du rappel, ce qui peut prendre un certain temps. C'est pourquoi vos messages sont hors service.

$.get(url, data, function(response) { 
    if (response == 'GOOD') { 
     alert('success!'); 
     DoSomethingMeaninfulHere(); 
    } else { 
     alert(response + "\n Update Unsuccessful"); 
    } 
}); 

vous devez mettre l'appel à

// DoSomethingMeaningfulHere 
alert(bValid + " 4"); 
if(bValid == true) 
{ 
    //do something 
} 
alert(bValid + " 5"); 

à l'intérieur de la fonction de rappel pour qu'il soit exécuté au bon moment (ce qui est après la requête AJAX complète)