Paź
1
2015

Wywołania zwrotne w JS

Node.js jako platforma oparta na silniku Javascript jest jednowątkowa oznacza to, że dzięki zastosowaniu takiej techniki niepotrzebne jest przełączanie między kontekstami procesora tak jak odbywa się to w przypadku innych środowisk uruchomieniowych takich jak: PHP czy RoR. Działanie Node.js opiera się na tzw. pętli zdarzeń, która rejestruje wszystkie zdarzenia wykonane przez użytkownika, te natomiast, trafiają do kolejki zdarzeń i stosując zasadę FIFO trafiają do wątka głównego aplikacji w przypadku zwolnienia zasobów. Z racji tego, że wszystkie zdarzenia wykonujące się w Node.js są asynchroniczne do funkcji przekazuje się tzw. callbacki – czyli wywołania zwrotne, które są uruchamiane przez te funkcje w stosownym czasie – najczęściej po wykonaniu wszystkich poleceń funkcji.

Zrzut ekranu z 2016-11-13 11-08-27

Powyższy schemat prezentuje działanie pętli zdarzeń oraz wykonywanych w trakcie jej działania procesów, które wykonują się asynchronicznie. Pierwszą obsługiwaną akcją przez pętlę jest wykonanie żądania AJAX poprzez wywołanie funkcji jQuery .post() . Kiedy zasób zostaje pobierany w tle, w międzyczasie użytkownik klika myszą w element z podpiętym zdarzeniem, przeglądarka rejestruje zdarzenie i je obsługuje. Dopiero po obsłudze zdarzenia onclick kiedy przychodzi odpowiedź  z serwera z żądanym zasobem wywoływana jest funkcja zwrotna, która jest zdefiniowana najczęściej jako ostatni argument funkcji asynchronicznych. Rozważając powyższy schemat, do funkcji jQuery.post() przekazywana jest tzw. funkcja anonimowa, której argumentem są otrzymane dane z zasobu. Wywołanie zwrotne powyższej funkcji uruchamiane jest natychmiast po zakończeniu funkcji, która wykonywała operacje w tle i zwraca do metody console.log() obiekt data przechowującego dane z żądanego zasobu. Wywołanie zwrotne zaprezentowane w tym podrozdziale spełnia swoje zadanie i nadaje się do obsługi prostych poleceń, które nie są skomplikowane. W przypadku chęci wykorzystania wywołania zwrotnego jako metody obiektu pojawia się problem ze słowem kluczowym this, który definiuje odwołanie do konkretnej instancji. Podczas korzystania z funkcji zwrotnej nie mamy dostępu do obiektu, która ją wywołuje dlatego rozwiązaniem problemu jest przekazanie wywołania zwrotnego wraz z referencją do obiektu, do którego należy ta funkcja. Rozważmy poniższy przykład:

  1. var zaimportujDane = function(callback,callback_obj) {
  2. // …
  3. if( typeof callback === „function”) {
  4. callback.call(callback_obj, lines);
  5. }
  6. // …
  7. };

Powyższy kod zawiera funkcje zaimportujDane(), która w przypadku przetworzenia zasobu – może to być duży plik tekstowy bądź dowolny plik pobrany z sieci, uruchamia wywołanie zwrotne wskazujące na poprawny obiekt this, który jest referencją do przekazanego obiektu jakim jest drugi argument funkcji zwrotnej. Wzorzec wywołania zwrotnego obecnie stosowany jest niezwykle często gdyż z jego pomocą, działania wykonywane przez użytkowników nie wywołują wrażenia “zamrożenia” aplikacji. Jednym z najlepszych przykładów jest funkcja czasowa. Uruchamia się po 5000 milisekundach i wykonuje funkcje anonimową typu alert().

  1. var wlaczOstrzezenie() = setTimeout(function() {
  2. alert(„BOMBA UZBROJONA”)},5000);

Powiązane wpisy

Autor wpisu:

Jakub Kądzielawa - młodszy programista PHP, student Informatyki, który łączy pracę ze swoją pasją. Czasami narzeka na brak wolnego czasu.

Zostaw komentarz