Asynchronous Programming (česky asynchronní programování) je programovací technika, při které program nemusí čekat na dokončení časově náročné operace a může mezitím pokračovat ve vykonávání dalšího kódu.
Tento přístup je běžný zejména ve webových aplikacích, síťové komunikaci, práci se soubory a serverových technologiích, jako jsou JavaScript: Kompletní monografie od A do Z a Node.js.
Některé operace mohou trvat relativně dlouho:
načítání dat ze serveru, komunikace s databází, čtení a zápis souborů, síťová komunikace, stahování obsahu z internetu.
Pokud by program na dokončení těchto operací čekal, mohl by být neaktivní nebo zablokovaný.
Při synchronním zpracování program čeká na dokončení každého kroku.
Krok 1 ↓ Dokončení ↓ Krok 2 ↓ Dokončení ↓ Krok 3
Výhodou je jednoduchost, nevýhodou možné blokování programu.
Při asynchronním zpracování může program pokračovat v práci, zatímco se operace provádí na pozadí.
Spuštění operace ↓ Program pokračuje dál ↓ Operace dokončena ↓ Zpracování výsledku
Synchronní kód:
console.log("První"); console.log("Druhý"); console.log("Třetí");
Výstup:
První Druhý Třetí
Asynchronní kód:
console.log("První"); setTimeout(() => { console.log("Druhý"); }, 1000); console.log("Třetí");
Výstup:
První Třetí Druhý
Historicky byly asynchronní operace řešeny pomocí Callback funkcí.
setTimeout(function() { console.log("Hotovo"); }, 1000);
Při větším množství callbacků mohl vzniknout problém označovaný jako Callback Hell.
Modernější řešení představují promise objekty.
fetch("/data") .then(response => response.json()) .then(data => console.log(data));
Promise reprezentuje hodnotu, která bude dostupná až v budoucnu.
Nejpřehlednější způsob zápisu asynchronního kódu nabízí konstrukce async a await.
async function nactiData() { const response = await fetch("/data"); const data = await response.json(); console.log(data); }
Kód se podobá synchronnímu zápisu, ale stále pracuje asynchronně.
V prostředí JavaScriptu je asynchronní programování úzce spojeno s mechanismem Event Loop.
Event Loop:
sleduje frontu událostí, zpracovává callbacky, koordinuje asynchronní operace, umožňuje efektivní využití jednoho vlákna.
Webové aplikace. REST API. Databázové operace. Streamování dat. Síťová komunikace. Mobilní aplikace. Cloudové služby. IoT systémy.
Vyšší výkon aplikace. Lepší odezva uživatelského rozhraní. Efektivní využití systémových prostředků. Možnost současného zpracování více úloh.
Složitější návrh aplikace. Náročnější ladění chyb. Obtížnější sledování toku programu. Riziko závodních podmínek (race conditions).
JavaScript: Kompletní monografie od A do Z Node.js Callback promise async await Event Event Loop Event-Driven Programming multithreading
Asynchronous Programming je způsob programování, při kterém aplikace nemusí čekat na dokončení časově náročných operací. Může pokračovat ve vykonávání dalších úloh a výsledek zpracovat až ve chvíli, kdy je připraven. Díky tomu jsou moderní aplikace rychlejší, lépe reagují na uživatele a efektivněji využívají systémové prostředky.