2010-11-11 3 views
1

J'ai un problème. La fonction ci-dessous fonctionne à 100%, mais l'instruction if qui appelle la fonction se résout avant que la fonction renvoie son résultat!JavaScript continue avant la fin de la fonction !? Ajax confusion asynchrone et solution

L'alerte pour "test2" montrera AVANT l'alerte avec le résultat "+". Quelle est la raison?

(le problème qu'il résout toujours à faux, peu importe ce que parce que rien ne retourne même quand quelque chose va être de retour!)

function checkUsername (username) { 
     $.post("ajax_messages.php",{ 
      func: "checkUsername", 
      username: username 
     }, function(data){ 
      alert("result: "+data); 
      return data; 
     }); 
    } 

    $('.send').click(function() { 
     if (checkUsername($receiverBox.val()) == "true") { 
      alert("test"); 
      return false; 
     } else { 
      alert("test2"); 
      return false; 
     } 
    }); 

Edit:

Merci pour les réponses rapides. J'ai essayé ce qui suit:

$.ajaxSetup({ 
     async:false 
    }); 

Édition2: Mais cela n'a pas non plus agi comme prévu. Comme un ensemble normal de fonctions serait donc je devrais agir. Donc, je vais essayer quelques-unes des méthodes ci-dessous

Édition3: Succès! C'est parfait. Un peu maladroit mais beaucoup plus lisse que toute autre méthode que j'ai pu trouver. J'espère que cela aide

var checkUsernameResult = false; 

    function checkErrorCheckingIsComplete() { 
     if (checkUsernameResult != false) { 
      alert(checkUsernameResult); 
     } 
    } 

    function checkUsername (username) { 
     $.post("ajax_messages.php",{ 
      func: "checkUsername", 
      username: username 
     }, function(data){ 
      alert("result: "+data); 
      checkUsernameResult = data; // each check has one of these 
      checkErrorCheckingIsComplete(); // all checks have this as the end 
     }); 
    } 

    $('.send', $message_box).click(function() { 
     checkUsername($receiverBox.val()); 
     //more checks here 
     return false; 
    }); 

Répondre

2

Je pense vous devrez peut-être créer un autre bouton qui effectue l'envoi, car vous n'aurez jamais la réponse avec les fonctions asynchrones d'Ajax.

Ajouter un autre bouton sur votre page HTML avec une classe « -send », puis essayer ...

var asynchResult = "false"; 
function checkUsername (username) { 
    $.post("ajax_messages.php",{ 
     func: "checkUsername", 
     username: username 
    }, function(data){ 
     alert("result: "+data); 
     asynchResult = data; 
     $('.actual-send').trigger('click'); 
    }); 
} 

$('.send').click(function() { 
    checkUsername($receiverBox.val()) 
    return false; 
} 
$('.actual-send').click(function() { 
    if(asynchResult == "true") { 
     alert("test"); 
     return true; 
    } else { 
     alert("test2"); 
     return false; 
    } 
} 
+1

J'ai changé de chanson, bonne idée! Je vais essayer tout de suite – Dorjan

+1

WOW, cela a fonctionné étonnamment – Dorjan

+0

Pour ceux qui lisent cela dans le futur, lisez le edit3 dans ma question et il vous expliquera. Merci pour l'idée digiguru – Dorjan

2

Depuis les appels AJAX sont asynchronous cela se produit. Utilisez une fonction de rappel pour .post et placez l'instruction if dans cela.

L'autre chose que vous pouvez faire est d'utiliser des appels synchrones. Mais cela empêchera le navigateur d'exécuter toute autre action dans l'intervalle.

+0

Impossible d'utiliser OP $ .ajax et async à false? – Yahel

+0

ah donc ajouter l'instruction check if au rappel? Je vais essayer maintenant – Dorjan

+0

hmm bien que cela fonctionne, je ne peux pas gérer le clic de la boîte de soumission via cette méthode ... même si je peux continuer à ajouter la vérification de plus en plus profonde dans le code je pensais que ce serait une mauvaise pratique? – Dorjan

1

Je n'ai pas utilisé jQuery depuis quelques mois, mais je suis assez sûr que vous pouvez définir un indicateur pour forcer l'appel Ajax à se produire comme un appel synchrone.

+0

$ .ajaxSetup ({ \t \t \t async: false \t \t}); – Dorjan

0

vous pouvez utiliser ce qui suit:

 
$.ajax({ 
    type: 'POST', 
    url: 'ajax_messages.php', 
    data: data, 
    success: function(html){ 
    alert(html); 
    } 
    dataType: dataType 
}); 

donc, à exécuter le succès POST fonction qui saisit quel que soit votre ajax_messages.php fera l'écho et des alertes avec elle

+0

Ceci est une réponse beaucoup plus compliquée que ce que Rahul a dit, et encore une fois ça me force à ... quel est ce mot ... imbrique tout mon contrôle d'erreur dynamique ... ce qui n'est pas ce que je veux vraiment car c'est une mauvaise pratique – Dorjan

0

mis asynchrone: false

+0

Vous pouvez le faire, mais gardez à l'esprit que vous verrouillerez le navigateur pendant que l'AJAX est en cours d'exécution. Vous devrez également utiliser la propriété AJAX dans jQuery. http://api.jquery.com/jQuery.ajax/ – digiguru

+0

oui mais existe-t-il un moyen de le faire sans forcer un utilisateur à imbriquer le gestionnaire dans le rappel? – Dorjan

+1

que ce qui est le but de "A" dans "A" JAX si vous n'utilisez pas asynchrone ;-) – m1k3y3

1

Comme les autres réponses ont dit, la méthode post() est asynchrone il exécute indépendamment du reste du code.

Si nécessaire, vous pouvez forcer jquery à appeler le serveur de façon synchrone en utilisant async:false à la place, je pense que vous devrez utiliser la fonction jQuery.ajax() à la place du raccourci .post() pour le faire.

En général, cela fonctionne beaucoup mieux de manière asynchrone, car en mode synchrone, la page Web sera gelée pendant l'attente de la réponse du serveur - ce qui n'est pas une excellente expérience pour vos visiteurs. Une meilleure idée est de le garder en mode asynchrone et de gérer la réponse du serveur dans le rappel de la méthode success().

+0

comme je l'ai mentionné ci-dessus, même si je comprends (maintenant) à propos de l'async etc. et la congélation etc. Je me demande comment il est possible d'utiliser ajax pour piéger les erreurs sans trop imbriquer (imaginez 10 éléments ...) – Dorjan

Questions connexes