Przed poniższą lekturą warto byś przypomniał sobie dział o asynchroniczności i ajaxie. Sporo rzeczy tutaj będzie się powtarzać.
$.ajax()
Funkcja $.ajax(), bo o niej mowa to główna, a zarazem najbardziej rozbudowana funkcja z tutaj omawianych. Ma ona postać:
$.ajax({url:"http://localhost:5000/movies",//gdzie się łączymymethod:"post",//typ połączenia, domyślnie getdataType:"json",//typ danych jakich oczekujemy w odpowiedzicontentType:"application/json",//typ wysyłanych danychdata:{//dane do wysyłkititle:"Przykładowy tytuł",author:"Karol Nowak",}}).done(res=>{//reaguję na odpowiedź - o tym poniżejconsole.log(res);});
To co ci powyżej pokazałem, to raczej bardziej rozbudowana wersja tej funkcji. W wielu sytuacjach nie będziesz musiał podawać wszystkich parametrów. Chociażby proste pobranie danych wymaga od nas podania tylko adresu url.
Warto przy okazji podać też właściwość dataType, która określa typ danych jakich oczekujemy w odpowiedzi. Jeżeli jej nie podamy, jQuery spróbuje ustalić typ zwróconych danych na podstawie zwróconego z serwera nagłówka "Content-Type" (co w większości sytuacji powinno być prawidłowe...).
Podczas wysyłania danych na serwer podajemy je jako obiekt przypisany pod właściwość data:
Domyślnie dane takie są dołączane jako query string dołączany do adresu na który się łączymy.
Jeżeli chcemy wysłać je w innym formacie, musimy dodatkowo ustawić właściwość Content-Type za pomocą właściwości contentType:
Funkcje zwrotne
Jeżeli chcemy zareagować na odpowiedź z serwera, możemy to zrobić na dwa sposoby.
Po pierwsze możemy użyć funkcji zwrotnych, które są dostępne dla nas w postaci dodatkowych parametrów:
Przykładowo:
Wraz z wersją 1.5 do jQuery wprowadzono obiekt $.Deferred, który jest bardziej rozbudowanym odpowiednikiem obietnic dla jQuery:
Dzięki niemu możemy reagować na asynchroniczne operacje za pomocą funkcji:
done()
wywoływane po pomyślnym zakończeniu asynchronicznej operacji (resolve)
fail()
wywoływane gdy operacja asynchroniczna zakończy się negatywnie (reject)
always()
wywoływane po zakończeniu asynchronicznej operacji - bez względu na to czy zakończyła się błędem czy sukcesem
progress()
wywoływane w momencie, gdy obiekt deferred poinformuje o postępie za pomocą funkcji notify()
Zamiast powyższych funkcji możemy także skorzystać z odpowiedników metod then() i catch(). Działają ona bardzo podobnie jak w czystym Javascript. Różnicą w przypadku jquery jest to, że dla metody then() możemy przekazać dodatkową trzecią funkcję, która jest odpowiednikiem powyższej funkcji progress().
Najważniejszą dla nas sprawą jest to, że zarówno powyżej omawiana funkcja $.ajax(), jak i poniżej omawiane jej skrócone odpowiedniki zwracają nam taki obiekt, dzięki czemu możemy na ich zakończenie reagować za pomocą wcześniej omawianych właściwości success, complete i error, ale też powyżej omawianych funkcji.
Użycie takich funkcji może mieć więc postać:
Podobnie do obietnic z czystego Javascript drugi sposób o wiele lepiej sprawdzi się w przypadku pisania funkcji służących do wczytywania danych:
Skrócone odpowiedniki
JQuery udostępnia nam też kilka funkcji będących alternatywnymi, skróconymi wariantami użycia powyżej funkcji $.ajax(). Funkcje te to odpowiednio:
$.get()
$.post()
$.getJSON()
$.getScript()
$.get()
Funkcja $.get() służy do wykonywania połączeń typu get. Jest to odpowiednik wywołania funkcji $.ajax() w postaci:
Przykłady użycia:
$.post()
Funkcja $.post() służy do wykonywania połączeń typu post. Jest ona odpowiednikiem wywołania $.ajax() w postaci:
Przykłady użycia:
$.getJSON()
Funkcja $.getJSON() służy do pobierania danych w formacie JSON. Jest ona odpowiednikiem wywołania $.ajax() w postaci:
Przykłady użycia:
$.getScript()
Funkcja $.getScript() służy do pobierania skryptów Javascript. Jest równocześnie odpowiednikiem wywołania $.ajax() w postaci:
Przykłady użycia:
$element.load()
Funkcja $element.load() służy do wczytywania treści z serwera i umieszczenia jej w danym elemencie.
Jej przykładowe użycie może mieć postać:
Wiele połączeń
Bardzo często zdarza się sytuacja, że musimy pobrać dane z wielu miejsc. Przykładowo mamy użytkownika, który ma swoje dane, ale ma też zbiór filmów itp.
Dzięki obiektowi $.Deferred możemy korzystać z dodatkowej metody $.when(deferred), która odpalana jest w momencie, gdy wszystkie przekazane do niej obietnice zostaną wykonane.
//pobieram dane i reaguję na odpowiedź za pomocą funkcji zwrotnej
$.get(url, res => {
console.log("Dane otrzymane:", res);
});
//pobranie danych z dołączeniem dodatkowych parametrów jako query string
$.get(url, { page: 1, key: "94381" }, res => {
console.log("Dane otrzymane:", res);
});
//pobieranie danych z wykorzystaniem funkcji done
const dataToSend = {
page: 1,
key: "94381"
}
$.get(url, dataToSend)
.done(res => {
console.log(res);
})
.fail(() => {
alert("Wystąpił błąd w połączeniu");
})