// classic functions have their own 'this' contextfunction(){};// arrow functions don't have their own 'this' context()=>{};// implicit returnconstmultiply=(a,b)=>a*b;
constname='Dave';constsentence1='My name is '+name+'.';constsentence2=`My name is ${name}.`;sentence1===sentence2;constarticle={title: 'Pokemons gone wild',text: 'Lorem ipsum'};constdom=` <article class="post"> <h2 class="post-heading">${article.title}</h2> <p class="post-paragraph">${article.text}</p> </article>`;
// Calls a function at specified intervalsconstintervalId=setInterval(()=>{console.log('every 1 second');},1000);// Plan and calls a function after a specified amount of timeconsttimeoutId=setTimeout(()=>{console.log('after 1 second');},1000);// Stop the intervalclearInterval(intervalId);// Cancel the planned function clearTimeout(timeoutId);
JavaScript good practice
ukládat věci z DOMu do proměnných, jelikož nimi budeme pracovat opakovaně, je zbytečné je znovu vybírat
nevytvářet globální proměnné pod scope window
nepoužívat == (!=) ale === (!==),
proměnné inicializovat přímo v místě deklarace
nemodifikovat DOM opakovaně (v cyklu)
Knihovny pro JavaScript
import knihovny - na pořadí záleží, pokud knihovna je závislá na jiné
importovat minifikovanou verzi
knihovny nestahovat k sobě ale používat CDN hosting
// a company object with its information{"name": "Veritas Inc.","capital": 1542000,"employees": ["Bill","Steve","Elon"],"address": {"street": "Wall Street 42","city": "New York","state": "NY","country": "United States of America"}}
// array of books and their authors[{"title": "Fantastic Beasts","author": "J. K. Rowling","year": 2001},{"title": "Game of Thrones","author": "George R.R. Martin","year": 1996}]
jak je dostat ze serveru a jak je poslat na server? pomocí AJAX
zkusíme fetch() a knihovnu axios
(async()=>{// using fetchtry{constresp=awaitfetch('https://jsonplaceholder.typicode.com/users');constdata=awaitresp.json();console.log(data);}catch(err){console.error(err);}// using axiostry{constresp=awaitaxios.get('https://jsonplaceholder.typicode.com/users');console.log(resp.data);}catch(err){console.error(err);}})();(async()=>{// using fetchtry{constresp=awaitfetch('https://jsonplaceholder.typicode.com/posts');constdata=awaitresp.json();console.log(data);}catch(err){console.error(err);}// using axiostry{constresp=awaitaxios.get('https://jsonplaceholder.typicode.com/posts');console.log(resp.data);}catch(err){console.error(err);}})();
AJAX
konvenční webová stránka komunikuje se serverem synchronním způsobem, tj. uživatel vyplní formulář, pošle ho a je přesměrován na jinou stránku s novými informacemi ze serveru
s AJAX se data posílají v pozadí pomocí JavaScript Request/Response (XHR) a podle výsledku se stránka aktualizuje (změní se DOM), žádné přesměrovávání - pak se jedná o tzv. Single Page (AJAX) Aplikace
Uživatel může pokračovat v práci zatímco program načítá data v pozadí
pomocí AJAX můžeme
aktualizovat/změnit obsah stránky - bez reloadu stránky
načítat data ze serveru - bez reloadu stránky
posílat data na server - bez reloadu stránky
to vše běží na pozadí - tj. vytváříme tím asynchronní webové aplikace
AJAX je kombinace technik pro načítání dat a jejich zobrazení, pomocí HTML, CSS, JavaScript, DOM, XHR, JSON, XML, ...
doporučený datový formáte pro přenos je právě JSON
browsery mají zabudovaný objekt XMLHttpRequest (XHR) pro asynchronní komunikace s API servery - volání HTTP požadavků, nebo lze použít knihovny třetích stran (axios, jQuery, fetch)
příklad volání klasické:
// built-in object for HTTP Requests GETconstxhr=newXMLHttpRequest();consturl='https://jsonplaceholder.typicode.com/posts';xhr.open('GET',url);xhr.addEventListener('load',()=>{// callbackconstdata=JSON.parse(xhr.responseText);});xhr.addEventListener('error',(e)=>{// callbackconsole.error('XHR error',e);});xhr.send();
// callback hell example - avoid it using promises or async/awaitload('/abc',(abcResp)=>{load('/def',(defResp)=>{load('/ghi',(ghiResp)=>{load('/jkl',(jklResp)=>{load('/mno',(mnoResp)=>{load('/pqr',(pqrResp)=>{console.log(...);});});});});});});// kazdy resp je dostupny pouze v ramci sveho scopuload('/abc').then((abcResp)=>{returnload('/def');}).then((defResp)=>{returnload('/ghi');}).then((ghiResp)=>{returnload('/jkl');}).then((jklResp)=>{returnload('/mno');}).then((mnoResp)=>{returnload('/pqr');}).then((pqrResp)=>{console.log(...);});// vsechny resp jsou dostupne ve scopu(async()=>{constabcResp=awaitload('/abc');constdefResp=awaitload('/def');constghiResp=awaitload('/ghi');constjklResp=awaitload('/jkl');constmnoResp=awaitload('/mno');constpqrResp=awaitload('/pqr');console.log(...);})();
Promise, async/await
Promise je objekt reprezentující eventuální ukončení / selhání asynchronní operace včetně její výsledky
axios.post(...)// vrací Promise - thenable - lze volat .then() nebo s async/awaitaxios.get(...)// vrací Promise - thenable - lze volat .then() nebo s async/awaitaxios.put(...)// vrací Promise - thenable - lze volat .then() nebo s async/awaitaxios.delete(...)// vrací Promise - thenable - lze volat .then() nebo s async/await
dostaneme objekt, na kterém lze volat metodu .then(callback) (nebo dát do async/await), jejíž callback se zavolá při ukončení asynchronní operace, podobně jako v případě event listeneru
// pomoci async/await syntax(async()=>{constresp=awaitaxios.get(...);doSomethingWith(resp.data);})();// pomoci promise syntaxaxios.get(...).then((resp)=>{doSomethingWith(resp.data);});
Promise nebo async/await nám umožňuje lépe kontrolovat asynchronní kód