2010-06-02 4 views
2

J'exécute un appel php à partir de javascript (jQuery), php sript renvoie le résultat. Le problème est que ces scripts PHP prennent du temps (en millisecondes), et le script Java n'attend pas qu'ils se terminent, donc les variables ne sont pas initialisées avec des valeurs correctes. Le code est simple:jquery to php (attendre le script php jusqu'au résultat/fin)

$.get("php/validation.php",{'email':email},function(data){ 
// valid_email now contains true/false 
alert(data); 
if(data=="true"){ 
var valid_email = true;} 
}); 

La « alerte » est une véritable impression, mais la valeur de valid_mail est reconnue comme « false » dans le code ci-dessous. Y at-il une autre meilleure façon d'appeler les scripts php et attendre jusqu'à ce qu'ils ne sont pas terminés?

Prashant

Répondre

2

Ce function(data) est appelé de manière asynchrone; il attend jusqu'à la fin du script PHP. Tout code sous ce bloc $.get() est cependant exécuté immédiatement. Si vous voulez que le code ci-dessous attende aussi, vous devez le déplacer dans cette fonction ou le placer dans une nouvelle fonction et l'appeler.

+0

Je suis novice en programmation web. Avons-nous une autre méthode (pas $ .get), mais plus facile et résoudre le problème ci-dessus? – user354051

+0

Non ... ça ne devient pas plus facile que ça. Vous avez juste à couper et coller votre code; ce n'est pas si dur ;) – mpen

1

Vous devez réagir à la réponse lorsque celle-ci est à ce moment-là, pas plus tôt. Bien sûr, JavaScript continue de fonctionner et n'attend pas la réponse (sinon l'utilisateur remarquerait le blocage du thread pendant l'attente). Soit vous le résoudre en utilisant une fonction de rappel séparée, comme ceci:

function checkValidity(email, callback) { 
    $.get("php/validation.php",{'email':email},function(data){ 
    // execute callback with true or false as the argument 
    callback(data=="true"); 
    } 
} 

function showValidity(valid) { 
    $("#someId").css("color", valid ? "green" : "red"); 
    // probably more 
} 

checkValidity($("#someField").text(), showValidity); 

ou en agissant droit dans le rappel de succès de se $.get():

function checkValidity(email, callback) { 
    $.get("php/validation.php",{'email':email},function(data){ 
    $("#someId").css("color", (data=="true") ? "green" : "red"); 
    } 
} 
0

Merci pour le conseil. Il a résolu la plupart du problème mais on continue à donner le même problème. La fonction ci-dessous envoie le mail mais la condition "false" est toujours exécutée.

$.post("php/send_email.php", $("#contact_form").serialize(),function(result){ 
    //and after the ajax request ends we check the text returned 
    if(result == 'sent'){ 
    //and show the mail success div with fadeIn 
    $('#mail_success').fadeIn(500); 

    }else{ 
    //show the mail failed div 
    $('#mail_fail').fadeIn(500); 
    } 
});