2009-10-28 10 views
33

Sto provando a chiamare una funzione che contiene il codice jQuery. Voglio che questa funzione restituisca i risultati dell'istruzione jQuery. Non funziona, e sto cercando di capire perché.

function showGetResult (name) { 
    var scriptURL = "somefile.php?name=" + name; 
    return $.get(scriptURL, {}, function(data) { return data; }); 
} 

alert (showGetResult("John")); 

L'avviso visualizza "[object XMLHttpRequest]". Tuttavia, se eseguo l'istruzione jQuery da sola, al di fuori di una funzione, funziona bene ->$.get(scriptURL, {}, function(data) { alert(data); })

Vorrei poter riutilizzare questo codice inserendolo all'interno di una funzione che restituisce $.get dati. Che errore fondamentale sto facendo qui?

risposta

87

Hai alcuni errori diversi. Innanzitutto, $ .get non restituisce il valore restituito della funzione di callback. Restituisce l'oggetto XHR. In secondo luogo, la funzione get non è sincrona, è asincrona quindi è probabile che showGetResult ritorni prima del completamento. In terzo luogo, non è possibile restituire qualcosa dall'interno del callback all'ambito esterno. È tuttavia possibile associare una variabile nell'ambito esterno e impostarla nella richiamata.

Per ottenere la funzionalità desiderata, è necessario utilizzare $ .ajax e impostare l'opzione asincrona su false. Quindi è possibile definire una variabile nell'ambito esterno e assegnarla nel callback ajax, restituendo questa variabile dalla funzione.

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; 
} 

Si sarebbe probabilmente essere meglio servita, però, per capire come fare quello che vuoi nella funzione di callback per sé piuttosto che modificare da asincrono alle chiamate sincrone.

+1

Grazie per l'approfondita interruzione. La combinazione del passaggio a sincrono e l'utilizzo di una variabile in ambito esterno per passare i dati, ha risolto il mio problema. – Kai

+5

Va bene, ma tieni presente che passando a sincrono, stai potenzialmente bloccando il browser mentre aspetti la risposta. Probabilmente è un errore, a meno che tu non sappia che il tuo utente sarà sempre connesso a una velocità incredibile e il tuo server non sarà mai sommerso.Inoltre, contrariamente a ciò che riguarda AJAX, è inteso a rendere le applicazioni web più reattive, ma questo cambiamento potrebbe renderla molto meno reattiva. –

+0

Sono d'accordo con @JacobM che è meglio usare asincrono se possibile e gestire le tue azioni nel callback. – tvanfosson

1

Questo è il modo sbagliato di fare. La funzione (dati) è una funzione di richiamata, quindi ogni volta che viene eseguito $ .get, è possibile che la funzione di richiamata non sia stata richiamata.

Meglio chiamare i dati del post ottenere la funzione dal metodo di funzione (dati).

9

L'errore fondamentale che si sta facendo è che la chiamata AJAX viene eseguita in modo asincrono, quindi al momento della restituzione, il risultato non è ancora pronto. Per fare questo puoi modificare il tuo codice in questo modo:

$(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

compito è quello di restituire questo risultato 'dati', non stampare quando caricato dal server. – Vlado

2

L'errore fondamentale è la parte "asincrona" di AJAX. Poiché non si sa quanto tempo impiegherà il server per inviare una risposta, i metodi AJAX non "bloccano" mai, cioè non si chiama il server e si rimane lì ad aspettare il risultato. Invece, si passa a qualcos'altro, ma si imposta un metodo, chiamato "callback", che si attiva quando i risultati tornano. Questo metodo è responsabile di fare tutto ciò che deve essere fatto con i dati (ad esempio inserendolo nella pagina).

Problemi correlati