Frage

Ich versuche, eine Funktion aufzurufen, die jQuery-Code enthält. Ich möchte diese Funktion, um die Ergebnisse der jQuery-Anweisung zurückzukehren. Es funktioniert nicht, und ich versuche, herauszufinden, warum.

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

alert (showGetResult("John"));

Der Alarm zeigt "[object XMLHttpRequest]." Allerdings, wenn ich die jQuery-Anweisung von selbst laufen, außerhalb einer Funktion, es funktioniert gut -> $.get(scriptURL, {}, function(data) { alert(data); })

Ich möchte in der Lage sein, diesen Code wiederverwenden, indem sie innerhalb einer Funktion setzen, die die $.get Daten zurückgibt. Welche grundlegenden Fehler bin ich hier machen?

War es hilfreich?

Lösung

Sie haben ein paar verschiedenen Fehler. Erstens $ hat .get nicht den Rückgabewert der Callback-Funktion zurückzukehren. Es gibt das XHR-Objekt. Zweitens ist die get-Funktion nicht synchron, asynchron es ist so showGetResult wahrscheinlich vor zurückkehren wird vervollständigt bekommen. Drittens können Sie nicht etwas aus dem Inneren der Rückruf an den äußeren Umfang zurück. Sie können jedoch binden, um eine Variable in dem äußeren Umfang und in der Callback setzen.

Um die Funktionalität zu erhalten, die Sie wollen, müssen Sie $ Schnipsel und stellen Sie die Asynchron-Option auf false verwenden. Dann können Sie eine Variable in dem äußeren Umfang definieren und in dem Ajax-Rückruf zuweisen, Rückkehr diese Variable von der Funktion.

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

Sie wahrscheinlich besser gedient wäre, wenn auch, herauszufinden, wie zu tun, was Sie in der Callback-Funktion wollen sich nicht von asynchronen zu synchronen Anrufe zu ändern.

Andere Tipps

Der grundlegende Fehler, den Sie machen, ist, dass der AJAX-Aufruf asynchron durchgeführt wird, so durch die Zeit, Sie zurückkommen, ist das Ergebnis noch nicht fertig. Um diese Arbeit zu machen, könnten Sie Ihren Code wie folgt ändern:

$(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); 
    });
}

Sieht aus wie Sie synchrone Anforderung wollen: Wie kann ich jQuery eine synchrone auszuführen, anstatt asynchron, Ajax-Request?

Oder Sie können Rückruf an Ihre Funktion übergeben:

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

showGetResult("John", function(data){ alert(data); });

Der Grundfehler ist der „asynchron“ Teil von AJAX. Weil Sie wissen nicht, wie lange der Server nie „Block“ eine Antwort zurück zu senden, AJAX Methoden nehmen - das heißt, nennt man nicht an den Server und nur dort sitzen auf das Ergebnis warten. Stattdessen gehen Sie auf etwas anderes, aber Sie eine Methode einrichten, die so genannten „Rückruf“, das ausgelöst wird, wenn die Ergebnisse kommen. Diese Methode ist für die tun, was mit den Daten getan werden muss (zum Beispiel in der Seite Injektion).

Das ist der falsche Weg zu tun. Die Funktion (Daten) ist eine Rückruffunktion so, wenn return $ .get wird ausgeführt, .. besteht die Möglichkeit, die Funktion zurückrufen würde nicht aufgerufen worden ist.

Besser Sie rufen Ihre Post-Daten erhalten Funktion von Funktion (Daten) Methode.

Ein effizienter Weg ist jQuery Latente Methode, sowohl Sync / Async-Anfragen an den Server und warten deferred.resolve () und ihn dann wieder aufgeschobene Versprechen Objekt zu verwenden. Sieht ein bisschen langweilig, aber ein wenig Studie ist sicher hilfreich für große Daten. (Tvanfosson der Funktion funktioniert gut, in diesem Fall, aber wenn ich auf Google-Analytics-Daten arbeitet, eine große Menge an Informationen hatte mich verrückt und so muß ich diese Lösung finden)

     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();

    }

das zurückgegebene Versprechen Objekt kann auch mit $.when(showResults('benjamin')).done(function() { }); für die Zeit nach Änderungen (wie Tabelle / Grafik-Einstellungen usw.) verwendet werden. vollständig wiederverwendbar. Sie können .deferred Anfragen stellen diese Funktion in einer Schleife von $ wie auch

        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();
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top