Gibt es eine Möglichkeit, mehr Daten in jQuery an eine Rückruffunktion zu übergeben?
Ich habe zwei Funktionen und möchte, dass der Rückruf an die $.post
beispielsweise sowohl die resultierenden Daten des AJAX-Aufrufs als auch einige benutzerdefinierte Argumente übergibt
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.
Antworten:
Die Lösung ist die Bindung von Variablen durch Schließen.
Als grundlegenderes Beispiel finden Sie hier eine Beispielfunktion, die eine Rückruffunktion empfängt und aufruft, sowie eine beispielhafte Rückruffunktion:
Dies ruft den Rückruf auf und liefert ein einzelnes Argument. Jetzt möchten Sie ein zusätzliches Argument angeben, sodass Sie den Rückruf zum Abschluss bringen.
Oder einfacher mit ES6-Pfeilfunktionen :
In Ihrem speziellen Beispiel habe ich die
.post
Funktion in jQuery nicht verwendet , aber ein kurzer Scan der Dokumentation legt nahe, dass der Rückruf ein Funktionszeiger mit der folgenden Signatur sein sollte:Daher denke ich, dass die Lösung wie folgt lautet:
Was ist los?
In der letzten Zeile
doSomething(extraStuff)
wird aufgerufen und das Ergebnis dieses Aufrufs ist ein Funktionszeiger .Weil
extraStuff
als Argument übergeben wird,doSomething
liegt im Rahmen derdoSomething
Funktion.Wenn
extraStuff
in der zurückgegebenen anonymen inneren Funktion darauf verwiesendoSomething
wird, ist dies durch Schließen an dasextraStuff
Argument der äußeren Funktion gebunden . Dies gilt auch nachdoSomething
der Rückkehr.Ich habe das oben genannte nicht getestet, aber ich habe in den letzten 24 Stunden sehr ähnlichen Code geschrieben und er funktioniert wie beschrieben.
Sie können natürlich mehrere Variablen anstelle eines einzelnen 'extraStuff'-Objekts übergeben, abhängig von Ihren persönlichen Vorlieben / Codierungsstandards.
quelle
Bei der Verwendung
doSomething(data, myDiv)
rufen Sie die Funktion tatsächlich auf und verweisen nicht darauf.Sie können die
doStomething
Funktion entweder direkt übergeben, aber Sie müssen sicherstellen, dass sie die richtige Signatur hat.Wenn Sie doSomething so lassen möchten, wie es ist, können Sie den Aufruf in eine anonyme Funktion einschließen.
Innerhalb des anonymen Funktionscodes können Sie die im umschließenden Bereich definierten Variablen verwenden. So funktioniert das Javascript-Scoping.
quelle
return function(...){...}
Funktion innerhalb derdoSomething
Funktion. Ich habe hier ein weiteres klares Beispiel für dasselbe Konzept gefunden: theelitist.net/…(function(myDiv){ ... })(myDiv)
zum Erfassen der VariablenmyDiv
. Dies geschieht implizit in der Antwort von @bradhouse.Es ist tatsächlich einfacher, als jeder es klingen lässt ... besonders wenn Sie die Basissyntax im Vergleich zu
$.ajax({})
einer der Hilfsfunktionen verwenden.Übergeben Sie das
key: value
Paar einfach wie bei jedem Objekt, wenn Sie Ihre Ajax-Anfrage einrichten ... (da$(this)
der Kontext noch nicht geändert wurde, ist es immer noch der Auslöser für den obigen Bindungsaufruf.)Einer der Gründe, warum dies besser ist als das Festlegen der Variable, ist, dass die Variable global und als solche überschreibbar ist. Wenn Sie zwei Dinge haben, die Ajax-Aufrufe auslösen können, können Sie sie theoretisch schneller auslösen, als der Ajax-Anruf antwortet Sie hätten den Wert für den zweiten Anruf an den ersten übergeben. Mit dieser Methode oben würde das nicht passieren (und es ist auch ziemlich einfach zu verwenden).
quelle
closure
Ich brauche es nur um zu arbeiten und das ist absolut ace, sauber, einfach und nicht global.In der heutigen Welt gibt es eine andere Antwort, die sauberer ist und einer anderen Antwort auf den Stapelüberlauf entnommen ist:
Hier ist die ursprüngliche Frage und Antwort: jQuery WIE GEHT? zusätzliche Parameter an den erfolgreichen Rückruf für einen $ .ajax-Aufruf übergeben?
quelle
Sie können auch Folgendes ausprobieren:
quelle
Sie können einen Abschluss von JavaScript verwenden:
und wann du kannst:
quelle
Ich habe im letzten Beitrag einen Fehler gemacht. Dies ist ein funktionierendes Beispiel für die Übergabe eines zusätzlichen Arguments in der Rückruffunktion:
quelle
Lass uns einfach gehen! :) :)
quelle
Eine allgemeinere Lösung zum Senden asynchroner Anforderungen mithilfe der
.ajax()
jQuery-API und von Schließungen, um zusätzliche Parameter an die Rückruffunktion zu übergeben:quelle
Für mich und andere Neulinge, die sich gerade mit Javascript in Verbindung gesetzt haben,
finde ich das
Closeure Solution
etwas zu verwirrend.Während ich das gefunden habe, können Sie mit jquery problemlos so viele Parameter wie Sie möchten an jeden Ajax-Rückruf übergeben.
Hier sind zwei einfachere Lösungen .
Erste, die @zeroasterisk oben erwähnt hat, Beispiel:
Zweitens: Übergeben Sie selbst definierte Daten, indem Sie sie zu den Daten hinzufügen,
XHR object
die in der gesamten Lebensdauer von Ajax-Anfrage-Antwort vorhanden sind.Wie Sie sehen können, haben diese beiden Lösungen den Nachteil, dass Sie jedes Mal etwas mehr Code schreiben müssen als nur schreiben:
Lesen Sie mehr über $ .ajax: http://api.jquery.com/jquery.ajax/
quelle
Wenn noch jemand hierher kommt, ist dies meine Meinung:
Was hier passiert, ist nach dem Binden an die Rückruffunktion innerhalb der Funktion als verfügbar
this
.Diese Idee stammt davon, wie React die
bind
Funktionalität nutzt .quelle
Sekundärer Weg:
quelle
Tatsächlich funktioniert Ihr Code nicht, weil beim Schreiben:
Sie platzieren einen Funktionsaufruf als dritten Parameter und nicht als Funktionsreferenz .
quelle
Als Ergänzung zur Antwort von b01
$.proxy
wird häufig das zweite Argument von verwendet, um diethis
Referenz zu erhalten . Zusätzliche Argumente, die an übergeben$.proxy
werden , werden teilweise auf die Funktion angewendet und füllen sie vorab mit Daten. Beachten Sie, dass alle Argumente,$.post
die an den Rückruf übergeben werden, am Ende angewendet werden. DaherdoSomething
sollten diese am Ende der Argumentliste stehen:Mit diesem Ansatz können auch mehrere Argumente an den Rückruf gebunden werden:
quelle