jQuery übergibt mehr Parameter an den Rückruf

Lesezeit: 8 Minuten

jQuery ubergibt mehr Parameter an den Ruckruf
atp

Gibt es eine Möglichkeit, mehr Daten an eine Callback-Funktion in jQuery zu übergeben?

Ich habe zwei Funktionen und ich möchte den Rückruf an die $.postum beispielsweise sowohl die Ergebnisdaten des AJAX-Aufrufs als auch einige benutzerdefinierte Argumente zu übergeben

function clicked() {
    var myDiv = $("#my-div");
    // ERROR: Says data not defined
    $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
    // ERROR: Would pass in myDiv as curData (wrong)
    $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
}

function doSomething(curData, curDiv) {

}

Ich möchte in der Lage sein, meine eigenen Parameter an einen Rückruf sowie das vom AJAX-Aufruf zurückgegebene Ergebnis zu übergeben.

  • Es ist erwähnenswert, dass jQuery.ajax() seit Version 1.4 eine Kontexteinstellung hat (jquery14.com/day-01/jquery-14) finden Sie hier ein Beispiel für die Verwendung: stackoverflow.com/questions/5097191/ajax-context-option/…

    – russau

    5. Oktober 11 um 8:34 Uhr

  • Ich habe mein Problem gelöst, die Daten zurückzugeben, nachdem AJAX abgeschlossen ist, und dann mache ich etwas.

    – Onaiggac

    25. Mai ’17 um 18:05 Uhr

1643913913 610 jQuery ubergibt mehr Parameter an den Ruckruf
Bradley Dwyer

Die Lösung ist die Bindung von Variablen durch Schließung.


Als einfacheres Beispiel ist hier eine Beispielfunktion, die eine Callback-Funktion empfängt und aufruft, sowie eine Beispiel-Callback-Funktion:

function callbackReceiver(callback) {
    callback("Hello World");
}

function callback(value1, value2) {
    console.log(value1, value2);
}

Dies ruft den Callback auf und liefert ein einzelnes Argument. Jetzt möchten Sie ein zusätzliches Argument bereitstellen, also schließen Sie den Rückruf ab.

callbackReceiver(callback);     // "Hello World", undefined
callbackReceiver(function(value) {
    callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});

Oder einfacher mit ES6 Pfeilfunktionen:

callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"

Was Ihr spezifisches Beispiel betrifft, habe ich die nicht verwendet .post Funktion in jQuery, aber ein kurzer Scan der Dokumentation legt nahe, dass der Rückruf a sein sollte Funktionszeiger mit folgender Signatur:

function callBack(data, textStatus, jqXHR) {};

Daher denke ich, dass die Lösung wie folgt ist:

var doSomething = function(extraStuff) {
    return function(data, textStatus, jqXHR) {
        // do something with extraStuff
    };
};

var clicked = function() {
    var extraStuff = {
        myParam1: 'foo',
        myParam2: 'bar'
    }; // an object / whatever extra params you wish to pass.

    $.post("someurl.php", someData, doSomething(extraStuff), "json");
};

Was ist los?

In der letzten Zeile, doSomething(extraStuff) ist aufgerufen und das Ergebnis dieses Aufrufs ist a Funktionszeiger.

Denn extraStuff wird als Argument an übergeben doSomething es liegt im Geltungsbereich der doSomething Funktion.

Wann extraStuff wird in der zurückgegebenen anonymen inneren Funktion von referenziert doSomething sie ist durch Schließung an die äußere Funktion gebunden extraStuff Streit. Das gilt auch danach doSomething ist zurückgekommen.

Ich habe das obige nicht getestet, aber ich habe in den letzten 24 Stunden sehr ähnlichen Code geschrieben und es funktioniert so, wie ich es beschrieben habe.

Sie können natürlich mehrere Variablen anstelle eines einzelnen ‘extraStuff’-Objekts übergeben, abhängig von Ihren persönlichen Vorlieben/Codierungsstandards.

  • Was ist der Zweck von ‘var doSomething = ‘? Wie unterscheidet sich dies von der bloßen Deklaration von doSomething als Funktion (dh function doSomething(…) {} )

    – Dave Neeley

    23. September 10 um 18:33 Uhr

  • Das ist nicht wahr. Für diese beiden Funktionsdeklarationen gelten unterschiedliche Geltungsbereichsregeln. Das Verhalten ist je nach JS-Laufzeit (Lesebrowser) sehr unterschiedlich. Versuchen Sie auch, den Funktionsnamen zu vergleichen, der in Stacktrace/Breakpoint in Firebug angezeigt wird.

    – Ihor Kaharlichenko

    25. Mai ’11 um 7:51 Uhr

  • Ihor: Sie haben absolut Recht mit dem Unterschied zwischen den beiden Deklarationsstilen. Eine gute Erklärung finden Sie hier: stackoverflow.com/questions/336859/…

    – Bradley Dwyer

    4. Oktober 11 um 0:37 Uhr

  • Dies kann aufgrund der Spezifität des Beispiels für Benutzer, die versuchen, dies auf allgemeinere Probleme anzuwenden, etwas schwierig zu verstehen sein. Ich habe ein vereinfachtes Beispiel hinzugefügt, um es etwas einfacher zu machen, sowie ein Pfeilfunktionsbeispiel, um zu verhindern, dass diese Frage als Duplikat des neu geposteten vorgeschlagenen Duplikats geschlossen wird. Wenn Sie der Meinung sind, dass meine Änderungen zu weit von der ursprünglichen Absicht Ihrer Antwort abgewichen sind oder auf andere Weise unangemessen sind, können Sie sie gerne rückgängig machen.

    Benutzer4639281

    25. November 16 um 18:38 Uhr

  • Überarbeitung 4 dieser Antwort wird auf Meta diskutiert

    – bjb568

    27. November 16 um 21:17 Uhr

1643913913 991 jQuery ubergibt mehr Parameter an den Ruckruf
Vinzenz Robert

Beim Benutzen doSomething(data, myDiv)rufen Sie die Funktion tatsächlich auf und verweisen nicht darauf.

Sie können entweder die bestehen doStomething direkt funktionieren, aber Sie müssen sicherstellen, dass es die richtige Signatur hat.

Wenn Sie doSomething so beibehalten möchten, wie es ist, können Sie seinen Aufruf in eine anonyme Funktion verpacken.

function clicked() {
    var myDiv = $("#my-div");
    $.post("someurl.php",someData, function(data){ 
      doSomething(data, myDiv)
    },"json"); 
}

function doSomething(curData, curDiv) {
    ...
}

Innerhalb des anonymen Funktionscodes können Sie die im umschließenden Gültigkeitsbereich definierten Variablen verwenden. So funktioniert Javascript-Scoping.

  • Dies ist meiner Meinung nach die beste Lösung, um der Klarheit willen. Kein Aufpreis return function(...){...} Funktion innerhalb der doSomething Funktion. Ich habe hier ein weiteres klares Beispiel für dasselbe Konzept gefunden: theelitist.net/…

    – William Dennis

    31. Oktober 11 um 08:28 Uhr


  • Ich denke, es gibt ein Problem mit diesem. Wenn sich Ihre zusätzlichen Daten (in diesem Fall myDiv) ändern, bevor der Callback ausgelöst wird, erhalten Sie den neuen Wert und nicht den alten! In meinem Fall habe ich Ajax-Aufrufe für Elemente in einem Array abgefeuert, und als der erste Aufruf von success() ausgeführt wurde, dachte es, dass es beim letzten Element erfolgreich war, als es das erste war! Bradhouses Antwort hat bei mir funktioniert.

    – Chris

    9. Dezember 14 um 1:32 Uhr

  • @Chris Ja, erfasste Variablen können in Javascript geändert werden. Wenn Sie dieses Verhalten nicht möchten, müssen Sie eine explizite Funktion erstellen, um den Wert zu erfassen. Die gebräuchlichste Redewendung ist eine selbstausführende Funktion (function(myDiv){ ... })(myDiv) um die Variable zu erfassen myDiv. Dies erfolgt implizit in der @bradhouse-Antwort.

    – Vinzenz Robert

    9. Dezember 14 um 10:23 Uhr

  • Wenn Sie diesen Ajax n-mal aufrufen, erstellt diese Methode n verschiedene Funktionen und übergibt sie an den Erfolgs-Callback. Das ist schlecht in Bezug auf die Leistung. Diese Antwort von @zeroasterisk zu unterlassen ist gut.

    – yılmaz

    14. Januar 16 um 15:21 Uhr

  • Ich stimme @WilliamDenniss zu, IMHO ist dies die beste, einfache und klare Lösung

    – sebasira

    22. November 19 um 18:30 Uhr

Es ist tatsächlich einfacher, als alle es klingen lassen … besonders wenn Sie das verwenden $.ajax({}) Basissyntax im Vergleich zu einer der Hilfsfunktionen.

Pass einfach in die key: value Paar wie bei jedem Objekt, wenn Sie Ihre Ajax-Anfrage einrichten … (weil $(this) hat den Kontext noch nicht geändert, es ist immer noch der Auslöser für den obigen Bind-Aufruf)

<script type="text/javascript">
$(".qty input").bind("keypress change", function() {
    $.ajax({
        url: "/order_items/change/"+$(this).attr("data-order-item-id")+"/qty:"+$(this).val()+"/returnas.json",
        type: "POST",
        dataType: "json",
        qty_input: $(this),
        anything_else_i_want_to_pass_in: "foo",
        success: function(json_data, textStatus, jqXHR) {
            /* here is the input, which triggered this AJAX request */
            console.log(this.qty_input);
            /* here is any other parameter you set when initializing the ajax method */
            console.log(this.anything_else_i_want_to_pass_in);
        }
    });
});
</script>

Einer der Gründe, warum dies besser ist als das Setzen der var, ist, dass die var global und als solche überschreibbar ist … wenn Sie zwei Dinge haben, die Ajax-Aufrufe auslösen können, könnten Sie sie theoretisch schneller auslösen, als Ajax-Aufrufe antworten, und Sie würden den Wert für den zweiten Aufruf an den ersten übergeben. Mit dieser Methode oben würde das nicht passieren (und es ist auch ziemlich einfach zu benutzen).

  • das ist genau das, wonach ich gesucht habe. Ich wusste nicht, wann Sie den dataType als json angegeben haben, es hat die Antwort automatisch für Sie analysiert. So nett (:

    – Hahn

    27. April 2012 um 15:38 Uhr

  • Klingt nach der besten Möglichkeit, zusätzliche Parameter an mich zurückzurufen. Mich würde interessieren, ob jemand einen Nachteil bei diesem Ansatz sieht? Am einfachsten und elegantesten. Danke!

    – Jan Zyka

    24. Januar 13 um 7:18 Uhr

  • die var ist global und als solche überschreibbar“. Es ist nicht, wenn Sie es innerhalb einer Funktion deklarieren, die auch viel besser lesbar ist als die obige Lösung. Using Schließungen ist ein saubererer Ansatz – siehe meine Antwort hier: stackoverflow.com/a/18570951/885464

    – Lorenzo Polidori

    3. September 13 um 8:51 Uhr

  • @LorenzoPolidori Ich bin anderer Meinung, ich finde den zusätzlichen Parameteransatz weitaus lesbarer.

    – Andreas Plummer

    19. November 14 um 4:07 Uhr

  • Das ist absolut genial. Wie kommt es, dass ich das noch nie zuvor gesehen habe. Ich brauche nicht closure Ich brauche es einfach, um zu funktionieren, und das ist absolut genial, sauber, einfach und nicht global.

    – Piotr Kula

    17. März 15 um 10:06 Uhr

jQuery ubergibt mehr Parameter an den Ruckruf
b01

In der heutigen Welt gibt es eine andere Antwort, die sauberer ist und aus einer anderen Stack Overflow-Antwort stammt:

function clicked()
{
    var myDiv = $( "#my-div" );

    $.post( "someurl.php", {"someData": someData}, $.proxy(doSomething, myDiv), "json" );
}

function doSomething( data )
{
    // this will be equal to myDiv now. Thanks to jQuery.proxy().
    var $myDiv = this;

    // doing stuff.
    ...
}

Hier ist die ursprüngliche Frage und Antwort: jQuery HOW TO?? Übergeben Sie zusätzliche Parameter an den Erfolgs-Callback für $.ajax-Aufruf?

Sie können auch Folgendes versuchen:

function clicked() {

    var myDiv = $("#my-div");

    $.post("someurl.php",someData,function(data){
        doSomething(data, myDiv);
    },"json"); 
}

function doSomething(curData, curDiv) {

}

1643913914 17 jQuery ubergibt mehr Parameter an den Ruckruf
Artem Barger

Sie können eine Schließung von JavaScript verwenden:

function wrapper( var1, var2,....) // put here your variables
{
  return function( data, status)
  {
     //Handle here results of call
  }
};

und wann kannst du:

$.post("someurl.php",data,wrapper(var1, var2, etc...),"html");

1643913914 773 jQuery ubergibt mehr Parameter an den Ruckruf
Igor

Ich habe einen Fehler in meinem letzten Post gemacht. Dies ist ein funktionierendes Beispiel für die Übergabe zusätzlicher Argumente in der Callback-Funktion:

function custom_func(p1,p2) {
    $.post(AJAX_FILE_PATH,{op:'dosomething',p1:p1},
        function(data){
            return function(){
                alert(data);
                alert(p2);
            }(data,p2)
        }
    );
    return false;
}

  • Sie sollten entweder Ihre ursprüngliche Antwort bearbeiten oder sie löschen, bevor Sie eine neue hinzufügen.

    – Brandstifter

    29. November 11 um 19:15 Uhr

.

758810cookie-checkjQuery übergibt mehr Parameter an den Rückruf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy