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
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.
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
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
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) {
}
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
}
};
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:
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