2009-10-28 5 views
33

J'essaie d'appeler une fonction qui contient du code jQuery. Je veux que cette fonction renvoie les résultats de l'instruction jQuery. Ça ne marche pas, et j'essaie de comprendre pourquoi. L'affichage affiche "[object XMLHttpRequest]". Cependant, si j'exécute l'instruction jQuery par elle-même, en dehors d'une fonction, cela fonctionne bien ->$.get(scriptURL, {}, function(data) { alert(data); })

J'aimerais pouvoir réutiliser ce code en le mettant dans une fonction qui retourne le $.get Les données. Quelle erreur fondamentale suis-je en train de faire ici?

Répondre

87

Vous avez quelques erreurs différentes. Premièrement, $ .get ne retourne pas la valeur de retour de la fonction de rappel. Il renvoie l'objet XHR. Deuxièmement, la fonction get n'est pas synchrone, elle est asynchrone, donc showGetResult retournera probablement avant d'être terminé. Troisièmement, vous ne pouvez pas retourner quelque chose à l'intérieur du rappel à la portée externe. Vous pouvez toutefois lier une variable dans la portée externe et la définir dans le rappel. Pour obtenir la fonctionnalité souhaitée, vous devez utiliser $ .ajax et définir l'option async sur false. Vous pouvez ensuite définir une variable dans la portée externe et l'affecter dans le rappel ajax, en retournant cette variable à partir de la fonction.

function showGetResult(name) 
{ 
    var result = null; 
    var scriptUrl = "somefile.php?name=" + name; 
    $.ajax({ 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'html', 
     async: false, 
     success: function(data) { 
      result = data; 
     } 
    }); 
    return result; 
} 

Vous seriez probablement mieux servis, cependant, trouver comment faire ce que vous voulez dans la fonction de rappel lui-même plutôt que de changer de asynchrone aux appels synchrones.

+1

Merci pour la ventilation complète. La combinaison du passage en synchrone et de l'utilisation d'une variable dans la portée externe pour transmettre des données a résolu mon problème. – Kai

+5

Très bien, mais sachez qu'en passant en synchrone, vous risquez de bloquer le navigateur en attendant la réponse. C'est probablement une erreur, à moins que vous sachiez que votre utilisateur sera toujours sur une connexion ultra-rapide et votre serveur ne sera jamais submergé.Cela va également à l'encontre de ce qu'AJAX est en train de faire: il vise à rendre les applications web plus réactives, mais ce changement pourrait potentiellement rendre le vôtre beaucoup moins réactif. –

+0

Je suis d'accord avec @JacobM qu'il est préférable d'utiliser asynchrone si possible et de traiter vos actions dans le rappel. – tvanfosson

1

C'est la mauvaise façon de faire. La fonction (data) est une fonction de rappel, à chaque fois que return $ .get va s'exécuter .. il est possible que la fonction de rappel n'ait pas été appelée.

Mieux vous appelez vos données de poste obtiennent la fonction de la fonction (données) méthode.

9

L'erreur fondamentale que vous faites est que l'appel AJAX est fait de manière asynchrone, donc au moment où vous revenez, le résultat n'est pas encore prêt. Pour que cela fonctionne, vous pouvez modifier votre code comme ceci:

$(function() { 
    showGetResult('John'); 
}); 

function showGetResult (name) { 
    $.get('somefile.php', { 
     // Pass the name parameter in the data hash so that it gets properly 
     // url encoded instead of concatenating it to the url. 
     name: name 
    }, function(data) { 
     alert(data); 
    }); 
} 
+0

est de restituer ce résultat « données », pas imprimer quand chargé depuis le serveur. – Vlado

2

L'erreur fondamentale est la partie "asynchrone" d'AJAX. Parce que vous ne savez pas combien de temps le serveur prendra pour renvoyer une réponse, les méthodes AJAX ne "bloque" jamais - c'est-à-dire que vous n'appelez pas le serveur et attendez juste le résultat. Au lieu de cela, vous passez à autre chose, mais vous configurez une méthode, appelée "callback", qui se déclenchera lorsque les résultats reviendront. Cette méthode est responsable de faire tout ce qui doit être fait avec les données (par exemple en l'injectant dans la page).