Return $.ottenere dati di una funzione utilizzando jQuery

Sto cercando di chiamare una funzione che contiene il codice jQuery. Voglio questa funzione per restituire i risultati di jQuery istruzione. Non è che 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"));

Visualizza l’avviso “[object XMLHttpRequest].” Tuttavia, se si esegue lo jQuery dichiarazione stessa, al di fuori di una funzione, funziona benissimo -> $.get(scriptURL, {}, function(data) { alert(data); })

Mi piacerebbe essere in grado di ri-utilizzare questo codice da mettere all’interno di una funzione che restituisce il $.get dati. Cosa fondamentale errore sto facendo qui?

InformationsquelleAutor Kai | 2009-10-28



6 Replies
  1. 94

    Si dispone di un paio di diversi errori. Primo, $.ottenere non restituisce il valore di ritorno della funzione di callback. Restituisce l’oggetto XHR. Secondo, la funzione get non sono sincrone, è asincrona in modo showGetResult probabilmente tornerà prima di ottenere la completa. Terzo, non è possibile restituire qualcosa dall’interno della richiamata per l’ambito esterno. Tuttavia, è possibile associare una variabile in ambito esterno e metterlo nella richiamata.

    Per ottenere la funzionalità che si desidera, è necessario utilizzare $.ajax e impostare il async opzione per falso. Quindi è possibile definire una variabile in ambito esterno e assegnarlo in ajax richiamata, di ritorno questa variabile in 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 servito, però, a capire come fare quello che vuoi in funzione di callback, piuttosto che cambiare asincrona e per le chiamate sincrone.

    • Grazie per l’approfondita break-down. La combinazione di commutazione sincrona e l’utilizzo di una variabile esterna-campo di applicazione per passare i dati, ha risolto il mio problema.
    • Va bene, ma essere consapevoli del fatto che la commutazione sincrona, si sta causando il browser di lock-up, durante l’attesa della risposta. Che probabilmente è un errore, a meno che il tuo utente sia sempre un fulmine veloce di connessione e il server non potrà mai essere sommersi. È anche il contrario di quello che AJAX è tutto — e ‘ pensato per rendere le applicazioni web più reattivo, ma questo cambiamento potrebbe potenzialmente rendere il vostro molto meno reattivo.
    • Sono d’accordo con @JacobM che è meglio utilizzare asincrona, se possibile e trattare con le vostre azioni nel callback.
    • tnx, è utile
    • +1 per la nota async: false
    • Quasi cinque anni dopo, ho dovuto tornare indietro e commento contro di me di cui sopra per l’utilizzo di sync invece di async. Come ignoranti ero. 😉

  2. 9

    L’errore fondamentale che si sta realizzando è che la chiamata AJAX è fatto in modo asincrono, quindi, una volta di ritorno, il risultato non è ancora pronto. Per fare questo lavoro si potrebbe modificare il codice come questo:

    $(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); 
        });
    }
    • Compito è quello di restituire questo ‘dati’ risultato, non per la stampa quando viene caricato dal server.
  3. 2

    L’errore fondamentale è il “asincrono” parte di AJAX. Perché non si sa per quanto tempo il server per l’invio indietro una risposta, metodi AJAX mai “blocco” — che è, non per chiamare il server e appena seduto lì in attesa per il risultato. Invece, si va a qualcos’altro, ma si imposta un metodo, chiamato “callback”, che il fuoco quando i risultati di tornare indietro. Questo metodo ha il compito di fare ciò che deve essere fatto con i dati (ad es. iniezione in pagina).

  4. 1

    Questo è il modo sbagliato di fare. La funzione(data) è una funzione call back così ogni volta che return $.ottenere eseguirà .. c’è possibilità che la funzione call back non sarebbe stato chiamato.

    Meglio si chiama il tuo post dati funzione funzione(data) il metodo.

  5. 0

    Un modo efficace è quello di utilizzare jQuery Differita metodo, sia sync/async le richieste al server e attendere che differite.risolvere() e poi ritorno rinviato oggetto promessa. Sembra un po ‘noioso, ma un po’ di studio si è sicuri di utile per grandi quantità di dati. ( tvanfosson funzione che non funziona bene, in questo caso, ma quando stavo lavorando sui dati di google analytics, una grande quantità di informazioni mi ha fatto impazzire e quindi ho bisogno di trovare questa soluzione)

         function showResults(name) { 
            var deferred = $.Deferred, requests = [];
    
            requests.push($.ajax({url:"/path/to/uri/?name=" + name, type: "GET", async: false}).done(function(d) { 
             //alert or process the results as you wish 
            }));
            $.when.apply(undefined, requests).then(function() { deferred.resolve(); }); 
            return deferred.promise();
    
        }

    restituito promessa oggetto può essere utilizzato anche con $.when(showResults('benjamin')).done(function() { }); per modifiche al post (come grafico/grafico impostazioni, ecc). completamente riutilizzabili.
    Si può anche mettere questa funzione in un ciclo di $.differite richieste, come,

            function updateResults() { 
                 var deferred = $.Deferred, requests = [];
                 requests.push($.ajax(url:"/path/to/names/?nameArr=" + jsonArrOfNames, type: "GET", async: false}).done(function(res) {  requests.push(showResults(res[0]));}) );
                 $.when.apply($, requests).then(function() { deferred.resolve(); }); 
                 return deferred.promise();
                }

Lascia un commento