„Odbieranie wiadomości z HTML5 WebSocket API; stosowanie kwerendy jQuery w celu realizacji wywołania AJAX; podłączanie zdarzenia; wdrażanie wywołania zwrotnego przy użyciu funkcji anonimowych; obsługa wskaźnika „this”.”
Opis zagadnienia zawiera wiele elementów, które na pierwszy rzut oka mogą wydawać się zupełnie różne, ale to co ich łączy, to mechanizm callback. Jest to tak zwana funkcja zwrotna, która rejestrowana jest przez autora kodu do wykonania przez bibliotekę, której używa. Callback wykonywany jest w odpowiednim czasie przez bibliotekę, która nie wie nic o tym co się wydarzy. Wszystko zależy od ciała zarejestrowanej funkcji.
HTML5 WebSocket API
Egzamin 70-480 wymaga od nas znajomości API WebSocket, które pojawiło się wraz z HTML5. Specyfikacja definiuje założenia komunikacji full-duplex, czyli w dwie strony serwer <-> przeglądarka <-> serwer.
Zakładane są cztery typy obsługiwanych callback:
- onopen – połączenie jest gotowe i można wysyłać wiadomości
- onmessage – w momencie otrzymania wiadomości z serwera
- onclose – w momencie zamknięcia połączenia
- onerror – w momencie wystąpienia błędu
Pierwszym krokiem jest oczywiście utworzenie połączenia:
var connection = new WebSocket('ws://localhost/');
Następnie możemy zdefiniować odpowiednie callback:
connection.onopen = function () { connection.send('Ping'); }; connection.onmessage = function (e) { console.log('Server: ' + e.data); }; connection.onclose = function(e) { console.log('Closed!'); }; connection.onerror = function (error) { console.log('WebSocket Error ' + error); };
Każdy z callbacków wykona się w ściśle zdefiniowanym momencie. Decyduje o tym API WebSocket oraz komunikacja z serwerem.
Staram się skupiać na podstawach, a zarazem materiale, który w pełni pokrywa założenia egzaminu 70-480. Jeżeli ktoś chce dowiedzieć się nieco więcej na temat HTML5 WebSocket API, to odsyłam do artykułu na html5rocks.com.
jQuery – get, post, ajax
Biblioteki jQuery przedstawiać nikomu nie trzeba. Zyskała ona ogromną popularność społeczności, a to za sprawą wielu ułatwień i funkcji, które zwyczajnie ułatwiają życie. jQuery również świetnie radzi sobie z asynchronicznością oraz obsługą requestów typu AJAX.
Polegają one na wykonywaniu operacji komunikacji z serwerem w tle. Tym samym możemy pobierać dane oraz zmieniać interfejs strony bez przeładowania okna przeglądarki.
Przedstawię niżej trzy najbardziej popularne metody do zapytań typu AJAX, które znajdziemy w bibliotece jQuery.
$.get
Pozwala wykonywać asynchroniczne zapytania typu GET. Sygnatura metody wygląda następująco:
$.get(url [,data] [,success] [,dataType])
, gdzie poszczególne parametry to:
- url – [String] – url pod jaki ma zostać wysłane zapytanie typu GET
- data – [PlainObject | String] – obiekt lub string, które wysłane zostają razem z zapytaniem do serwera
- success – [Function(data, textStatus, jqXHR)] – funkcja i zarazem nasz callback, który wykonany zostanie w momencie poprawnego obsłużenia odpowiedzi. Parametry, które zostaną przekazane do wywołania funkcji to:
- data – [PlainObject] – zwrócone dane
- textStatus – [String] – status odpowiedzi
- jqXHR – [jqXHR] – odpowiednik XMLHTTPRequest
- dataType – [String] – typ zwracanych danych – xml, json, script, html. Domyślnie ustalany na podstawie zwróconych danych.
Funkcja $.get jest odpowiednikiem (skrótem) dla funkcji $.ajax:
$.ajax({ url: url, data: data, success: success, dataType: dataType });
$.post
W zasadzie od funkcji $.get różni się tym, że tym razem wysyła na serwer asynchroniczne żądanie typu POST. Zestaw parametrów jest tutaj identyczny, a odpowiednikiem funkcji $.ajax jest:
$.ajax({ type: "POST", url: url, data: data, success: success, dataType: dataType });
$.ajax
Funkcja, która zawsze wywoływana jest pod spodem. Jest to najbardziej ogólna funkcja pozwalająca na definiowanie asynchronicznych zapytań. Jej pełna specyfikacja znajduje się na stronie jQuery. Posiada pokaźną liczbę parametrów i opisywanie ich wszystkich tutaj byłoby sporym nadmiarem materiału do przyswojenia.
callback i słowo kluczowe this
W zasadzie o czymś podobnym pisałem już we wpisie o wywoływaniu i obsłudze zdarzeń. Chodzi mianowicie o dostęp do kontekstu this wywołanej funkcji. Spójrzmy na przykład funkcji, która wykonuje callback na sam koniec swojego działania:
function callbackFn() { console.log(this); } function invoke(x, y, callback) { var xy = x + y; callback(); } invoke(1, 2, callbackFn);
Co będzie wynikiem console.log(this)? Na konsoli otrzymamy obiekt window. Jak przekazać kontekst funkcji wywołującej callback? No to kolejny przykład:
function callbackFn() { console.log(this); } function invoke(x, y, callback) { var xy = x + y; callback.call(xy); } invoke(1, 2, callbackFn);
Zmiana nastąpiła w linii 6 poprzez użycie call. Tym razem wyliczona wartość xy została przekazana do funkcji callbackFn i stanowi jej kontekst (this).