Što je funkcija povratnog poziva u JavaScript-u?

Ovaj članak daje kratki uvod u koncept i upotrebu funkcija povratnog poziva u programskom jeziku JavaScript.

Funkcije su Objekti

Prvo što moramo znati je da su u Javascriptu funkcije prvoklasni objekti. Kao takvi, možemo raditi s njima na isti način na koji radimo s drugim objektima, poput dodjeljivanja varijablama i prosljeđivanja kao argumenta u druge funkcije. To je važno, jer nam potonja tehnika omogućuje proširenje funkcionalnosti u našim aplikacijama.

Funkcije povratnog poziva

Funkcija povratnog poziva je funkcija koja je prošao kao argument u drugu funkciju, biti „pozvan” na kasnije vrijeme. Funkcija koja prihvaća druge funkcije kao argumente naziva se funkcijom višeg reda , koja sadrži logiku kada se funkcija povratnog poziva izvršava. Kombinacija ove dvije vrste omogućuje nam proširivanje naše funkcionalnosti.

Da bismo ilustrirali povratne pozive, krenimo sa jednostavnim primjerom:

function createQuote(quote, callback){ var myQuote = "Like I always say, " + quote; callback(myQuote); // 2 } function logQuote(quote){ console.log(quote); } createQuote("eat your vegetables!", logQuote); // 1 // Result in console: // Like I always say, eat your vegetables!

U gornjem primjeru createQuoteje funkcija višeg reda koja prihvaća dva argumenta, a drugi je povratni poziv. logQuoteFunkcija se koristi za proći kao naš povratni poziv funkcije. Kada izvršavamo createQuotefunkciju (1) , primijetite da ne dodajemo zagrade logQuotekad je prosljeđujemo kao argument. To je zato što našu funkciju povratnog poziva ne želimo izvršiti odmah, jednostavno želimo proslijediti definiciju funkcije funkciji višeg reda kako bi se mogla izvršiti kasnije.

Također, moramo osigurati da ako funkcija povratnog poziva koju prosljeđujemo očekuje argumente, da ćemo ih dostaviti prilikom izvršavanja povratnog poziva (2) . U gornjem primjeru to bi bila callback(myQuote);izjava, jer znamo da logQuoteočekuje predaju citata.

Uz to, anonimne funkcije možemo proslijediti kao povratne pozive. Poziv u nastavku createQuotebi imao isti rezultat kao i gornji primjer:

createQuote("eat your vegetables!", function(quote){ console.log(quote); });

Usput, ne morate koristiti riječ "povratni poziv" kao naziv svog argumenta, Javascript samo mora znati da je to ispravno ime argumenta. Na temelju gornjeg primjera, donja funkcija ponašat će se na potpuno isti način.

function createQuote(quote, functionToCall) { var myQuote = "Like I always say, " + quote; functionToCall(myQuote); }

Zašto koristiti funkcije povratnog poziva?

Većinu vremena stvaramo programe i aplikacije koji rade sinkrono . Drugim riječima, neke od naših operacija započinju tek nakon završetka prethodnih. Često kada zatražimo podatke iz drugih izvora, poput vanjskog API-ja, ne znamo uvijek kada će se naši podaci vratiti. U tim slučajevima želimo pričekati odgovor, ali ne želimo uvijek da se cijela naša aplikacija zaustavi dok se preuzimaju naši podaci. U tim su situacijama funkcije povratnog poziva korisne.

Pogledajmo primjer koji simulira zahtjev poslužitelju:

function serverRequest(query, callback){ setTimeout(function(){ var response = query + "full!"; callback(response); },5000); } function getResults(results){ console.log("Response from the server: " + results); } serverRequest("The glass is half ", getResults); // Result in console after 5 second delay: // Response from the server: The glass is half full!

U gornjem primjeru upućujemo lažni zahtjev poslužitelju. Nakon proteka 5 sekundi odgovor se mijenja i tada getResultsse izvršava naša funkcija povratnog poziva . Da biste to vidjeli na djelu, možete kopirati / zalijepiti gornji kôd u razvojni alat preglednika i izvršiti ga.

Također, ako ste već upoznati setTimeout, tada ste cijelo vrijeme koristili funkcije povratnog poziva. Argument anonimne funkcije proslijeđen u setTimeoutpozivu funkcije gornjeg primjera ujedno je i povratni poziv! Dakle, izvorni povratni poziv primjera zapravo izvršava drugi povratni poziv. Pazite da ne ugnijezdite previše povratnih poziva ako vam mogu pomoći, jer to može dovesti do nečega što se zove "pakao povratnog poziva"! Kao što i samo ime govori, nije mi zadovoljstvo nositi se s tim.