Czy ktoś może mi podać prosty przykład wywołań zwrotnych nodeJs? Szukałem już tego samego na wielu stronach internetowych, ale nie jestem w stanie tego poprawnie zrozumieć, Proszę podać prosty przykład.
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
Chcę zrobić coś takiego ...
javascript
node.js
asynchronous
callback
asynccallback
Bhushan Goel
źródło
źródło
Odpowiedzi:
Teraz otwórz węzeł lub konsolę przeglądarki i wklej powyższe definicje.
Na koniec użyj go z następną linią:
Z poszanowaniem konwencji błędów w stylu węzła
Costa zapytał, jak by to wyglądało, gdybyśmy przestrzegali konwencji wywołania zwrotnego błędu węzła.
W tej konwencji wywołanie zwrotne powinno oczekiwać otrzymania co najmniej jednego argumentu, pierwszego argumentu, jako błędu. Opcjonalnie będziemy mieć jeden lub więcej dodatkowych argumentów, w zależności od kontekstu. W tym przypadku kontekstem jest powyższy przykład.
Tutaj przepisuję nasz przykład w tej konwencji.
Jeśli chcemy zasymulować przypadek błędu, możemy zdefiniować usingItNow w ten sposób
Końcowe użycie jest dokładnie takie samo jak powyżej:
Jedyna różnica w zachowaniu byłaby
usingItNow
zależna od tego, która wersja została zdefiniowana: ta, która przekazuje „prawdziwą wartość” (obiekt Error) do wywołania zwrotnego dla pierwszego argumentu, czy ta, która przekazuje mu wartość zerową dla argumentu błędu .źródło
Funkcja zwrotna to po prostu funkcja, którą przekazujesz do innej funkcji, aby funkcja mogła ją wywołać w późniejszym czasie. Jest to często widoczne w asynchronicznych interfejsach API ; wywołanie API wraca natychmiast, ponieważ jest asynchroniczne, więc przekazujesz do niego funkcję, którą interfejs API może wywołać po zakończeniu wykonywania zadania asynchronicznego.
Najprostszym przykładem, jaki przychodzi mi do głowy w JavaScript, jest
setTimeout()
funkcja. Jest to funkcja globalna, która przyjmuje dwa argumenty. Pierwszy argument to funkcja zwrotna, a drugi argument to opóźnienie w milisekundach. Funkcja została zaprojektowana tak, aby czekać przez odpowiednią ilość czasu, a następnie wywołać funkcję zwrotną.Być może widziałeś już powyższy kod, ale po prostu nie zdawałeś sobie sprawy, że funkcja, którą przekazujesz, nazywa się funkcją zwrotną. Moglibyśmy przepisać powyższy kod, aby był bardziej oczywisty.
Wywołania zwrotne są używane w Node w każdym miejscu, ponieważ Node jest zbudowany od podstaw, aby był asynchroniczny we wszystkim, co robi. Nawet podczas rozmowy z systemem plików. Dlatego mnóstwo wewnętrznych interfejsów API Node akceptuje funkcje zwrotne jako argumenty, zamiast zwracać dane, które można przypisać do zmiennej. Zamiast tego wywoła funkcję zwrotną, przekazując żądane dane jako argument. Na przykład możesz użyć
fs
biblioteki Node do odczytania pliku.fs
Moduł wystawia dwie unikalne funkcje API:readFile
areadFileSync
.readFile
Funkcja jest asynchroniczny, gdyreadFileSync
nie jest oczywisty. Możesz zobaczyć, że zamierzają używać wywołań asynchronicznych, gdy tylko jest to możliwe, ponieważ je wywołali,readFile
areadFileSync
zamiastreadFile
ireadFileAsync
. Oto przykład użycia obu funkcji.Synchroniczny:
Powyższy kod blokuje wykonywanie wątku, dopóki cała zawartość nie
test.txt
zostanie wczytana do pamięci i zapisana w zmiennejdata
. W węźle jest to zwykle uważane za złą praktykę. Są jednak chwile, kiedy jest to przydatne, na przykład podczas pisania krótkiego, małego skryptu, aby zrobić coś prostego, ale żmudnego, i nie zależy ci zbytnio na oszczędzaniu każdej nanosekundy, jaką możesz.Asynchroniczne (z wywołaniem zwrotnym):
Najpierw tworzymy funkcję zwrotną, która przyjmuje dwa argumenty
err
idata
. Jednym z problemów związanych z funkcjami asynchronicznymi jest to, że przechwytywanie błędów staje się trudniejsze, więc wiele funkcji API w stylu wywołań zwrotnych przekazuje błędy jako pierwszy argument funkcji wywołania zwrotnego. Najlepiej jest sprawdzić, czyerr
ma wartość, zanim zrobisz cokolwiek innego. Jeśli tak, zatrzymaj wykonywanie wywołania zwrotnego i zarejestruj błąd.Połączenia synchroniczne mają przewagę, gdy występują wyjątki, ponieważ można je po prostu złapać za pomocą
try/catch
bloku.W funkcjach asynchronicznych nie działa to w ten sposób. Wywołanie API wraca natychmiast, więc nie ma nic do złapania z
try/catch
. Właściwe asynchroniczne interfejsy API, które używają wywołań zwrotnych, zawsze wychwytują własne błędy, a następnie przekazują je do wywołania zwrotnego, gdzie można je obsłużyć według własnego uznania.Oprócz wywołań zwrotnych istnieje jednak inny popularny styl interfejsu API, który jest powszechnie używany, zwany obietnicą. Jeśli chcesz o nich poczytać, możesz przeczytać cały wpis na blogu, który napisałem na podstawie tej odpowiedzi tutaj .
źródło
Oto przykład kopiowania pliku tekstowego za pomocą
fs.readFile
ifs.writeFile
:A to przykład użycia
copyFile
funkcji:Wspólny wzorzec node.js sugeruje, że pierwszy argument funkcji zwrotnej jest błędem. Powinieneś użyć tego wzorca, ponieważ wszystkie moduły sterowania przepływem na nim polegają:
źródło
Wypróbuj ten przykład tak prosty, jak tylko potrafisz, po prostu skopiuj save newfile.js do node newfile, aby uruchomić aplikację.
źródło
tworzymy prostą funkcję jak
źródło
„fs” to moduł węzła, który pomaga w czytaniu pliku. Funkcja wywołania zwrotnego zapewni, że plik o nazwie „input.txt” zostanie w całości odczytany, zanim zostanie wykonany. Funkcja fs.stat () służy do pobierania informacji o pliku, takich jak rozmiar pliku, data utworzenia i data modyfikacji.
źródło
źródło
A
callback
to funkcja przekazana jako parametr doHigher Order Function
( wikipedia ). Prosta implementacja wywołania zwrotnego to:Aby wywołać funkcję, po prostu przekaż inną funkcję jako argument do zdefiniowanej funkcji.
źródło
Ten post na blogu ma dobry opis:
https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced
źródło