2012-07-13 1 views
0

J'ai écrit cette fonction dans jQuery:Comment synchroniser les valeurs de la fonction de retour dans jQuery?

function checkAvailability(value) { 
    var result = true; 
    $.getJSON("registration/availability", { username: value }, function(availability) {    
     if (!availability) 
      result = false; 
      alert("in getJSON: " + result); 
    }); 
    alert(result); 
    return result; 
} 

J'ai eu alerte de « getJSON » après cette seconde. Pourquoi est-ce arrivé de cette façon?

J'ai le projet Spring MVC et la méthode Controller qui vérifie la disponibilité du nom d'utilisateur. La méthode du contrôleur fonctionne correctement. Mais je reçois le résultat final trop tard. Comment puis-je le synchroniser pour retourner correctement la valeur dans ma fonction?

EDIT

J'utilise cette fonction dans jQuery valider. J'ai extrait la fonction checkAvailability() pendant mon test.

$.validator.addMethod("checkAvailability", function(value, element, param) {  
    var das = checkAvailability(value); 
    return das; 
}, jQuery.format("Someone already has that username. Please try another one.")); 

Et voici ma forme validate:

$(".form").validate({ 
    rules: { 
     username: { 
      checkAvailability: true 
     }, 
     .... 
    }, 
    messages: { 
    } 
}); 

EDIT 2

Ceci est ma méthode Controller. Il renvoie une valeur booléenne. Si le nom d'utilisateur était pris, il retournerait une valeur erronée.

@RequestMapping(value="/registration/availability", method = RequestMethod.POST) 
public @ResponseBody boolean getAvailability(@RequestParam String username) {  
    List<User> users = getAllUsers();   

    for (User user : users) { 
     if (user.getUsername().equals(username)) { 
      return false; 
     } 
    } 

    return true; 
} 

Répondre

1

Pourquoi cela se comporte-t-il de cette façon?

$.getJSON est un raccourci pour faire une requête AJAX. Le 'A' dans ajax signifie asynchrone. Cela signifie que le moteur javascript déclenche l'appel getJSON puis exécute immédiatement les lignes suivantes, alert(result); return result;

La valeur réelle renvoyée par le service Web sera reçue par votre code à un moment ultérieur. La fonction success que vous avez transmise à getJSON sera appelée une fois que le moteur js aura reçu la réponse du serveur. Comme vous pouvez le voir, il est trop tard à ce moment-là.

Pour en savoir plus: https://developer.mozilla.org/en/AJAX

Que puis-je faire pour faire ce travail?

Cela dépend de votre situation. Qui appelle checkAvailabilty? Si vous postez du code sur la façon dont cette fonction est utilisée, je peux donner des exemples avec mes suggestions. En haut de ma tête, vous pouvez soit utiliser jquery deferreds, bel article sur the same. Ou vous pouvez passer une fonction de rappel qui est exécutée à l'intérieur de votre fonction de succès.

EDIT:

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

La ressource Serverside est appelée via .ajax $ (XMLHttpRequest) et obtient une paire clé/valeur, ce qui correspond au nom de l'élément validé et sa valeur en tant que paramètre GET.La réponse est évaluée comme JSON et doit être vrai pour les éléments valides, et peut être tout faux, non défini ou nul pour les éléments non valides,

Pour avoir une idée du monde réel, vérifier la démo http://jquery.bassistance.de/validate/demo/captcha/

Ouvrez Firebug ou les outils de développement de votre choix. Allez dans l'onglet qui vous permet de voir les requêtes AJAX. Entrez le captcha, soumettez. Vérifiez la requête ajax comme indiqué dans l'outil de développement. Notez les paramètres de la chaîne de requête. Notez la réponse. C'est un simple "vrai" ou "faux".

+0

Merci un milion pour votre réponse. J'ai édité ma question. Je l'utilise dans jQuery validate. – woyaru

+0

Mise à jour de la réponse avec un lien vers la documentation de validation de jquery. Il y a une option qui est destinée à gérer votre scénario exact. –

+0

Il semble très similaire. Je viens de tester cette solution. Mais cela ne semble pas fonctionner. Je me demande quelle méthode dans le contrôleur ou la fonction de php doivent retourner. – woyaru

0

Je ne sais pas si cela aide ou non, mais vous pouvez utiliser

var result; 
$.ajax({ 
     url : "registration/availability", 
     data : data, 
     async : false //syhcrononous ajax request ;) 
}).done(function(data) { 
    result = data; 
}); 

pour plus d'informations vous pouvez consulter JQuery AJAX doc

Questions connexes