Pourquoi ma fonction jQuery AJAX renvoie-t-elle toujours la valeur false?

function check_username(){ $.ajax({ type: "POST", dataType: 'json', url: "/ajax/check/username.html", data: "via=ajax&username="+$('input[name=register_username]').val(), success: function(msg){ if(msg.response==false){ register_username.parent().css('background-color','#db2e24'); register_username.parent().parent().find('td:last-child').text(msg.message); register_username.focus(); return false; } else { register_username.parent().css('background-color','#fff'); register_username.parent().parent().find('td:last-child').text(""); return true; } } }); } 

Je suis désolé si mon anglais n’est pas bon – l’anglais n’est pas ma langue maternelle. De retour au sujet, pourquoi la fonction ci-dessus renvoie-t-elle toujours la valeur false? FYI: le JSON est OK

check_username appelle une fonction ajax qui lance une opération de mise en réseau puis revient immédiatement. check_username renvoyé bien avant la fin de l’appel ajax et l’appel du gestionnaire de réussite. Ainsi, le gestionnaire de succès n’a rien à faire avec la valeur check_username par check_username .

Etant donné qu’il n’y a pas de valeur de retour dans la fonction check_username elle-même (uniquement dans la fonction de gestionnaire de réussite intégrée), check_username renvoie undefined qui est une valeur falsey. Vous pensez donc qu’elle renvoie toujours la valeur false.

Si vous voulez utiliser quelque chose avec la valeur de retour du gestionnaire de succès, vous devez alors utiliser le gestionnaire de succès lui-même ou appeler une autre fonction du gestionnaire de succès. Voici comment fonctionnent les opérations asynchrones.

Renvoyer true ou false partir de la fonction de gestionnaire de réussite ne fait rien. Le gestionnaire de réussite est appelé par les éléments internes du code de traitement ajax et, en revenant du gestionnaire de réussite, il ne fait que pénétrer dans les entrailles des éléments internes ajax. La valeur de retour du gestionnaire de succès n’est utilisée d’aucune manière.

Le problème est la condition logique msg.response == false .. elle est toujours évaluée à false, la réponse n’est pas un booléen. Vous devez plutôt vérifier l’état de la réponse.

Si je devais deviner, vous postez et la réponse renvoyée est un object JSON. Mais cela ressemble à votre vérification pour voir si vous avez une réponse valide. Pourquoi ne pas l’essayer de cette façon:

Essaye ça:

 function check_username() { $.ajax({ type: "POST", dataType: 'json', url: "/ajax/check/username.html", data: "via=ajax&username="+$('input[name=register_username]').val(), success: function( msg, textStatus ) { if ( textStatus == "success" ) { register_username.parent().css('background-color','#db2e24'); register_username.parent().parent().find('td:last-child').text(msg.message); register_username.focus(); return false; } else { register_username.parent().css('background-color','#fff'); register_username.parent().parent().find('td:last-child').text(""); return true; } }, error: function( jqXHR, textStatus, errorThrown ) { if ( textStatus == "parsererror" ) { alert( "There is an error in your JSON object" ); } } }); } 

L’autre problème que vous pourriez avoir est que votre json non valide n’est pas retourné, ce que jQuery vérifiera. Ajouter une erreur aidera à déterminer si c’est effectivement le cas.

Démo en direct http://jsfiddle.net/khalifah/4q3EJ/