jQuery - Ajax

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ę łączymy
    method: "post", //typ połączenia, domyślnie get
    dataType: "json", //typ danych jakich oczekujemy w odpowiedzi
    contentType: "application/json", //typ wysyłanych danych
    data: { //dane do wysyłki
        title: "Przykładowy tytuł",
        author: "Karol Nowak",
    }
})
.done(res => { //reaguję na odpowiedź - o tym poniżej
    console.log(res);
});

W praktyce parametrów możliwych do ustawienia jest ciut więcej.

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.

$.ajax({
    url: "https://jsonplaceholder.typicode.com/posts"
})
.done(res => {
    console.log(res);
});

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.

Last updated