2010-01-19 27 views
0

J'ai une simple fonction de clic avec le code ci-dessous, mais je n'arrive pas à obtenir les données sur le premier clic.Drupal Ajax récupération de données retardée

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
alert(testit); 

Dans ma fonction de rappel, j'ai simplement retourné drupal_json ('bonjour'); mais il n'apparaît pas avant la deuxième fois. Par exemple, si je clique sur le bouton, rien ne se passera, mais si je le clique de nouveau, il alertera 'bonjour'. Dans le cas où il y a des données dynamiques, il sera également retardé d'un clic. Par exemple, disons que cliquer sur la première fois devrait alerter 1, 2ème fois devrait alerter 2, et ainsi de suite. Au lieu de cela, le premier clic ne fera rien, le deuxième clic alertera 1, le troisième clic alertera 2, etc. Des idées pour lesquelles cela se produit? Merci.

Répondre

0

le a dans ajax signifie asynchrone. Par conséquent, testit ne sera pas réglé sur le résultat de la réponse du ajax jusqu'à ce que la fonction success: est appelée (lorsque l'appel ajax est terminé avec succès)

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; alert(testit); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 

si vous souhaitez que cela fonctionne de manière synchrone, vous pouvez également définir aysnc:false dans .ajax options jQuery, comme ceci:

var testit = $.ajax({ 
    type: 'POST', 
    async: false, 
    url: 'test/get/1', 
    dataType: 'json', 
    data: 'js=1' 
}).responseText; 

alert(testit); 

dans la deuxième méthode, javascript ALL sera retardée jusqu'à ce que l'appel ajax (habituellement, sensiblement lent). Je recommande de simplement faire votre code dans le rappel success: du premier exemple. Toutefois, vous pouvez également créer un rappel error:, juste au cas où quelque chose échouerait (sinon, votre rappel ne sera JAMAIS appelé, car il n'y a pas eu de succès).

+0

Merci, a appris quelque chose de nouveau. – Wade

0

Cela se produit probablement car la requête AJAX ne bloque pas le script. Il va de l'avant et fait la demande, mais n'attend pas que les résultats reviennent avant qu'il n'exécute la ligne suivante (votre alerte). Ainsi, la première fois qu'il touche l'alerte, aucune donnée n'a été récupérée, la seconde fois il n'a que les données de la première requête (la deuxième demande a démarré, mais n'est pas terminée), et ainsi de suite.

La solution est de mettre l'alerte dans votre fonction de rappel qui ne soit pas exécuté tant que la réponse a été reçue:

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { alert(result); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
+0

Merci pour la solution alternative. J'ai besoin d'utiliser la variable plus tard si bien que je vais aller avec la solution asynchrone. – Wade