Czy istnieje sposób na przekazanie większej ilości danych do funkcji zwrotnej w jQuery?
Mam dwie funkcje i chcę, aby wywołanie zwrotne $.post
na przykład przekazało zarówno dane wynikowe wywołania AJAX, jak i kilka niestandardowych argumentów
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) {
}
Chcę mieć możliwość przekazania własnych parametrów do wywołania zwrotnego, a także wyniku zwróconego z wywołania AJAX.
Odpowiedzi:
Rozwiązaniem jest wiązanie zmiennych poprzez zamknięcie.
Jako bardziej podstawowy przykład, oto przykładowa funkcja, która odbiera i wywołuje funkcję zwrotną, a także przykładową funkcję zwrotną:
To wywołuje wywołanie zwrotne i podaje pojedynczy argument. Teraz chcesz podać dodatkowy argument, więc zamknij wywołanie zwrotne.
Lub, po prostu, używając ES6 Funkcje strzałek :
Jeśli chodzi o konkretny przykład, nie użyłem tej
.post
funkcji w jQuery, ale szybki skan dokumentacji sugeruje, że wywołanie zwrotne powinno być wskaźnikiem funkcji o następującej sygnaturze:Dlatego myślę, że rozwiązanie jest następujące:
Co się dzieje?
W ostatnim wierszu
doSomething(extraStuff)
jest wywoływany, a wynikiem tego wywołania jest wskaźnik funkcji .Ponieważ
extraStuff
jest przekazywany jako argument, należy dodoSomething
zakresudoSomething
funkcji.Gdy
extraStuff
jest odwołany w zwróconej anonimowej funkcji wewnętrznejdoSomething
, jest związany przez zamknięcieextraStuff
argumentu funkcji zewnętrznej . Dzieje się tak nawet podoSomething
powrocie.Nie testowałem powyższego, ale napisałem bardzo podobny kod w ciągu ostatnich 24 godzin i działa tak, jak to opisałem.
Możesz oczywiście przekazać wiele zmiennych zamiast jednego obiektu „extraStuff” w zależności od osobistych preferencji / standardów kodowania.
źródło
Podczas używania
doSomething(data, myDiv)
wywołujesz funkcję i nie odwołujesz się do niej.Możesz przekazać tę
doStomething
funkcję bezpośrednio, ale musisz upewnić się, że ma poprawny podpis.Jeśli chcesz zachować doSomething taki, jaki jest, możesz zawrzeć jego wywołanie w funkcji anonimowej.
Wewnątrz anonimowego kodu funkcji można użyć zmiennych zdefiniowanych w obejmującym zakresie. W ten sposób działa zakres JavaScript.
źródło
return function(...){...}
funkcji w ramachdoSomething
funkcji. Znalazłem tutaj inny wyraźny przykład tej samej koncepcji: theelitist.net/…(function(myDiv){ ... })(myDiv)
do przechwytywania zmiennejmyDiv
. Odbywa się to domyślnie w odpowiedzi na @bradhouse.W rzeczywistości jest to łatwiejsze niż wszyscy brzmią ... zwłaszcza jeśli używasz
$.ajax({})
podstawowej składni vs. jednej z funkcji pomocnika.Po prostu przekaż
key: value
parę, tak jak w przypadku dowolnego obiektu, podczas konfigurowania żądania ajax ... (ponieważ$(this)
nie zmienił jeszcze kontekstu, nadal jest wyzwalaczem wywołania wiązania powyżej)Jednym z powodów, dla których jest to lepsze niż ustawianie var, jest to, że var jest globalny i jako taki jest nadpisywalny ... jeśli masz 2 rzeczy, które mogą wywoływać wywołania ajax, możesz teoretycznie wywołać je szybciej niż odpowiedzi wywołania ajax, i wartość drugiego połączenia zostanie przekazana do pierwszego. Zastosowanie powyższej metody nie byłoby możliwe (i jest dość proste w użyciu).
źródło
closure
, potrzebuję go tylko do działania, a to absolutnie as, czysty, prosty i nieglobalny.W dzisiejszym świecie istnieje inna odpowiedź, która jest czystsza i zaczerpnięta z innej odpowiedzi Przepełnienie stosu:
Oto oryginalne pytanie i odpowiedź: jQuery JAK? przekazać dodatkowe parametry do wywołania zwrotnego dla połączenia $ .ajax?
źródło
Możesz także spróbować czegoś takiego:
źródło
Możesz użyć zamknięcia JavaScript:
a kiedy możesz:
źródło
Popełniłem błąd w ostatnim poście. Oto działający przykład przekazywania dodatkowych argumentów w funkcji zwrotnej:
źródło
Przejdźmy prosto! :)
źródło
Bardziej ogólne rozwiązanie do wysyłania żądań asynchronicznych za pomocą
.ajax()
interfejsu API i zamknięć jQuery w celu przekazania dodatkowych parametrów do funkcji wywołania zwrotnego:źródło
Dla mnie i innych początkujących, którzy właśnie skontaktowali się z Javascriptem,
myślę, że
Closeure Solution
jest to trochę zbyt mylące.Chociaż znalazłem to, możesz łatwo przekazać tyle parametrów, ile chcesz do każdego wywołania zwrotnego ajax za pomocą jquery.
Oto dwa łatwiejsze rozwiązania .
Pierwszy, o którym wspominał @zeroasterisk , przykład:
Po drugie, przekaż dane zdefiniowane przez siebie, dodając je do tego,
XHR object
co istnieje w całym okresie życia ajax-żądanie-odpowiedź.Jak widać, te dwa rozwiązania mają tę wadę, że za każdym razem musisz napisać trochę więcej kodu niż tylko napisać:
Przeczytaj więcej o $ .ajax: http://api.jquery.com/jquery.ajax/
źródło
Jeśli ktoś nadal tu przychodzi, oto moje zdanie:
Co się tutaj stanie, po powiązaniu z funkcją wywołania zwrotnego, będzie ona dostępna w ramach funkcji jako
this
.Pomysł pochodzi z tego, jak React wykorzystuje tę
bind
funkcjonalność.źródło
Drugi sposób:
źródło
tak naprawdę twój kod nie działa, ponieważ kiedy piszesz:
umieszczasz wywołanie funkcji jako trzeci parametr zamiast odwołania do funkcji .
źródło
Jako dodatek do odpowiedzi b01 drugi argument
$.proxy
często służy do zachowaniathis
odniesienia. Dodatkowe przekazane argumenty$.proxy
są częściowo stosowane do funkcji, wstępnie wypełniając ją danymi. Zauważ, że wszelkie argumenty$.post
przekazywane do wywołania zwrotnego zostaną zastosowane na końcu, dlategodoSomething
powinny znajdować się na końcu listy argumentów:Takie podejście pozwala również na powiązanie wielu argumentów z wywołaniem zwrotnym:
źródło