V dnešnom dynamickom svete informačných technológií sa neustále stretávame s potrebou efektívne spravovať udalosti a reagovať na ne v reálnom čase. Či už ide o interakcie používateľa, sieťové požiadavky alebo systémové oznámenia, schopnosť asynchrónne spracovávať tieto udalosti je kľúčová pre tvorbu responzívnych a výkonných aplikácií. Možno ste sa už stretli s pojmami ako „callback“ alebo „event handler“ a premýšľali ste, ako vlastne fungujú a ako ich môžeme optimalizovať, aby naša práca bola plynulejšia a efektívnejšia. Táto oblasť IT je fascinujúca a jej pochopenie vám môže otvoriť dvere k lepšiemu dizajnu softvéru.
Asynchrónne spracovanie udalostí je v podstate mechanizmus, ktorý umožňuje aplikácii pokračovať v práci bez čakania na dokončenie dlhotrvajúcej operácie. Namiesto toho, aby sa program zablokoval, keď čaká na odpoveď zo siete alebo na dokončenie súborového vstupu/výstupu, môže sa venovať iným úlohám. Keď sa dlhotrvajúca operácia dokončí, spustí sa špecifická funkcia – práve tá „callback rutina“ alebo „event handler“ – ktorá sa postará o spracovanie výsledku. Toto je základný stavebný kameň moderného programovania, ktorý zabezpečuje, že naše aplikácie zostávajú pohotové a užívateľsky prívetivé.
V tomto článku sa ponoríme hlbšie do tajov optimalizácie callback rutín a asynchrónneho spracovania udalostí. Preskúmame, ako fungujú event handlery, aké sú bežné úskalia a predovšetkým, ako môžeme tieto mechanizmy vylepšiť, aby naše aplikácie bežali rýchlejšie a efektívnejšie. Pripravte sa na prehľad najlepších praxí, techník a užitočných tipov, ktoré vám pomôžu stať sa majstrom v správe udalostí.
Pochopenie Základov: Ako Fungujú Event Handlers a Callback Routines
V srdci asynchrónneho spracovania udalostí ležia dva kľúčové koncepty: event (udalosť) a event handler (spracovateľ udalosti), často implementovaný pomocou callback rutiny. Udalosť je v podstate čokoľvek, čo sa v systéme stane a na čo chceme reagovať – kliknutie myšou, stlačenie klávesu, dokončenie sieťového prenosu, časovač, ktorý vypršal, alebo dokonca chyba.
Event handler je potom špecifická funkcia alebo metóda, ktorá je navrhnutá tak, aby sa spustila, keď dôjde k určitej udalosti. Tento handler „počúva“ na konkrétnu udalosť a keď sa táto udalosť „vyskytne“, systém automaticky zavolá príslušný handler. V asynchrónnom programovaní je tento mechanizmus obzvlášť silný, pretože handler sa spustí po tom, ako sa hlavná vykonávacia niť aplikácie mohla venovať iným úlohám.
Callback rutina je typom event handleru, kde funkcia odovzdá inú funkciu ako argument. Táto odovzdaná funkcia (callback) sa potom vykoná neskôr, zvyčajne po dokončení nejakej asynchrónnej operácie. Predstavte si to ako odkaz na inú funkciu, ktorý sa spustí v správny čas. Napríklad, keď požiadate o dáta zo vzdialeného servera, môžete poskytnúť callback funkciu, ktorá sa spustí, keď dáta dorazia.
Prečo je Optimalizácia Dôležitá?
V jednoduchých aplikáciách s malým počtom udalostí nemusí byť optimalizácia callback rutín a asynchrónneho spracovania priorita. Avšak pri rastúcej komplexnosti softvéru a zvyšujúcom sa počte súčasne prebiehajúcich operácií sa neefektívne spracovanie môže stať vážnym problémom.
Neoptimalizované handlery môžu viesť k niekoľkým negatívnym dôsledkom:
- Zhoršený výkon: Príliš veľa operácií čakajúcich na spracovanie alebo dlhé vykonávanie handlerov môže spomaliť celú aplikáciu.
- Zvýšená latencia: Používatelia môžu zaznamenať oneskorenie pri interakcii s aplikáciou, pretože systém reaguje pomaly.
- Vyššia spotreba zdrojov: Neefektívne spracovanie môže viesť k zbytočnému plytvaniu pamäťou a výpočtovým výkonom.
- Nestabilita aplikácie: V extrémnych prípadoch môže neefektívne alebo chybné spracovanie udalostí viesť k pádom aplikácie alebo neočakávanému správaniu.
Preto je pochopenie a aplikovanie optimalizačných techník nevyhnutné pre budovanie robustných a škálovateľných systémov.
Bežné Úskalia pri Práci s Callback Routines
Pri implementácii asynchrónneho spracovania udalostí a callback rutín sa programátori často stretávajú s určitými výzvami. Poznanie týchto úskalí nám pomôže vyhnúť sa im a napísať čistejší kód.
Callback Hell (Peklo Callbackov)
Jeden z najznámejších problémov, najmä v jazykoch, ktoré pôvodne silno spoliehali na callbacky (ako staršie verzie JavaScriptu), je tzv. „callback hell“ alebo „peklo callbackov“. Toto nastáva, keď máme hlboko vnořené callbacky, ktoré sa volajú jeden po druhom. Kód sa stáva ťažko čitateľným, ťažko spravovateľným a veľmi náchylným na chyby. Každá nová asynchrónna operácia vyžaduje ďalšie vnořené volanie, čo vedie k pyramídovej štruktúre kódu.
operacia1(param1, function(result1) {
operacia2(param2, result1, function(result2) {
operacia3(param3, result2, function(result3) {
// ... a tak ďalej
});
});
});
Správa Stavov a Chýb
S asynchrónnym spracovaním súvisí aj zložitejšia správa stavov a chýb. V synchronnom svete je ľahké sledovať tok programu a zachytávať výnimky. V asynchrónnom prostredí môže byť náročnejšie určiť, ktorá operácia zlyhala, a ako správne reagovať. Callback rutiny musia byť navrhnuté tak, aby správne spracovávali úspechy aj zlyhania.
Konkurencia a Synchronizácia
Ak viacero asynchrónnych operácií beží súbežne a ich výsledky ovplyvňujú spoločné zdroje, môže dôjsť k problémom so súbežnosťou a potrebou synchronizácie. Bez správneho mechanizmu na synchronizáciu môže dôjsť k „pretekaniu dát“ (race conditions), kde poradie vykonania operácií ovplyvňuje konečný výsledok nepredvídateľným spôsobom.
Výkonové Úzke Hrdlá v Handleri
Samotný kód vnútri callback rutiny môže predstavovať výkonové úzke hrdlo. Ak handler vykonáva dlhotrvajúce alebo výpočtovo náročné operácie, môže zablokovať spracovanie ďalších udalostí alebo spomaliť celkovú odozvu systému.
„Efektívne spracovanie udalostí nie je len o tom, či aplikácia reaguje, ale aj o tom, ako rýchlo a ako spoľahlivo reaguje na podnety z okolia.“
Techniky Optimalizácie Callback Routines
Teraz sa pozrime na konkrétne techniky, ktoré nám pomôžu zlepšiť výkon a čitateľnosť nášho asynchrónneho kódu.
1. Používanie Moderných Asynchrónnych Konštrukcií
Mnohé moderné programovacie jazyky a frameworky ponúkajú lepšie alternatívy k tradičným callbackom, ktoré pomáhajú predchádzať „callback hell“ a zlepšujú správu chýb.
- Promises (Sľuby): V jazykoch ako JavaScript, Python alebo Java, Promises (alebo ekvivalenty ako
FuturealeboTask) predstavujú hodnotu, ktorá môže byť dostupná hneď alebo neskôr. Umožňujú reťaziť asynchrónne operácie elegantnejšie pomocou metód ako.then()a.catch(). - Async/Await: Táto syntaxická cukrovinka (syntactic sugar) nad Promises alebo podobnými konštrukciami umožňuje písať asynchrónny kód, ktorý vyzerá a číta sa takmer ako synchronný kód.
asyncfunkcie automaticky vracajú Promise a kľúčové slovoawaitpozastaví vykonávanie funkcie, kým sa Promise nevyrieši, bez blokovania hlavného vlákna.
# Príklad s async/await v Pythone
import asyncio
async def fetch_data(url):
# Simulácia asynchrónneho načítania dát
await asyncio.sleep(1)
return f"Data from {url}"
async def process_urls(urls):
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks)
return results
async def main():
urls = ["http://example.com/1", "http://example.com/2"]
data = await process_urls(urls)
print(data)
asyncio.run(main())
Používanie async/await výrazne zlepšuje čitateľnosť a zjednodušuje správu chýb, pretože výnimky sa dajú zachytávať pomocou tradičných try-except blokov.
2. Minimalizácia Práce v Callback Rutinách
Základné pravidlo optimalizácie: callback rutina by mala byť čo najjednoduchšia a najrýchlejšia. Ak callback vykonáva dlhotrvajúce operácie, zvážte presunutie tejto práce mimo neho.
- Asynchrónne spracovanie dlhých úloh: Ak callback potrebuje vykonať dlhú výpočtovú úlohu, spustite ju ako samostatnú asynchrónnu úlohu (napr. v inom vlákne alebo procese) a callback nech len nastaví potrebné príznaky alebo pridá výsledok do frontu na neskoršie spracovanie.
- Delegovanie práce: V niektorých prípadoch môže byť vhodné delegovať spracovanie na špecializované služby alebo worker procesy.
3. Efektívne Spracovanie Viacerých Udalostí
Ak vaša aplikácia musí reagovať na veľké množstvo udalostí súčasne, je dôležité mať efektívny mechanizmus na ich správu.
- Event Loop (Slučka udalostí): Väčšina asynchrónnych runtime prostredí používa event loop. Toto je mechanizmus, ktorý neustále sleduje zoznam udalostí, ktoré čakajú na spracovanie, a spúšťa príslušné handlery. Optimalizácia event loopu môže zahŕňať minimalizáciu času, ktorý handler strávi vykonávaním.
- Spracovanie dávok (Batching): Ak prichádza veľké množstvo podobných udalostí, môže byť efektívnejšie ich spracovať v dávkach, namiesto individuálneho spracovania každej udalosti. Napríklad, namiesto okamžitého ukladania každého záznamu do databázy, ich môžete zhromaždiť a uložiť ich naraz.
- Prioritizácia udalostí: V niektorých aplikáciách môžu byť niektoré udalosti dôležitejšie ako iné. Implementácia mechanizmu na prioritizáciu udalostí zabezpečí, že kritické udalosti sú spracované rýchlejšie.
4. Správa Stavov a Chýb
- Centralizované spracovanie chýb: Namiesto toho, aby každý callback mal vlastné spracovanie chýb, zvážte centralizovaný mechanizmus, ktorý zachytáva chyby z rôznych asynchrónnych operácií a loguje ich alebo ich oznamuje používateľovi.
- Používanie stavových strojov (State Machines): Pre zložitejšie asynchrónne procesy s viacerými krokmi a možnými stavmi môže byť použitie stavového stroja účinným spôsobom, ako riadiť tok dát a zabezpečiť správne spracovanie všetkých možných scenárov.
5. Optimalizácia Pamäte a Zdrojov
- Vyhýbanie sa zbytočnému alokovaniu: V callback rutine sa snažte minimalizovať alokáciu pamäte, najmä ak sa funkcia volá často.
- Uvoľňovanie zdrojov: Uistite sa, že všetky zdroje (súbory, sieťové pripojenia, pamäť) sú správne uvoľnené po ich použití, aby sa predišlo únikom pamäte (memory leaks).
„Asynchrónnosť je mocný nástroj, ale vyžaduje si disciplínu. Bez nej sa ľahko stratíte v spleti volaní a stavov.“
Príklady Použitia a Scenáre
Poďme sa pozrieť na niekoľko konkrétnych príkladov, kde je optimalizácia callback rutín kľúčová.
Webové Aplikácie a API Požiadavky
V moderných webových aplikáciách, najmä tých postavených na JavaScripte (frontend aj backend s Node.js), sú asynchrónne operácie na dennom poriadku. Načítavanie dát zo servera, spracovanie používateľských vstupov, komunikácia s databázami – to všetko sú operácie, ktoré sa často vykonávajú asynchrónne.
- Fetch API/Axios: Pri komunikácii s REST API sa používajú callbacky (alebo Promises/async-await), ktoré sa spustia po prijatí odpovede zo servera. Optimalizácia tu znamená rýchle spracovanie odpovede, minimalizáciu oneskorenia pri zobrazovaní dát používateľovi a efektívne spracovanie chýb pri sieťových problémoch.
- Event Listeners v prehliadači: Kliknutia na tlačidlá, pohyby myšou, odosielanie formulárov – všetky tieto udalosti sú spracovávané pomocou event listenerov, ktoré sú v podstate callback rutiny. Ak tieto rutiny vykonávajú náročné operácie (napr. manipulácia s DOM), môžu spôsobiť zasekávanie používateľského rozhrania.
Dátové Spracovanie a Streamovanie
Pri práci s veľkými objemami dát, ako je napríklad pri spracovaní logov, dátových streamov alebo vykonávaní komplexných analýz, je asynchrónne spracovanie nevyhnutné.
- Stream API (napr. Node.js streams): Streamy umožňujú spracovať dáta po častiach, namiesto načítania celého súboru do pamäte. Callbacky sa tu používajú na spracovanie každej prijatej „dávky“ dát (
dataevent) alebo na signalizáciu konca streamu (endevent). Optimalizácia znamená efektívne spracovanie jednotlivých chunkov, aby sa predišlo zahlteniu pamäte alebo oneskoreniu spracovania. - Asynchrónne databázové operácie: Pri práci s databázami sa často používajú asynchrónne ovládače, ktoré vracajú výsledky prostredníctvom callbackov alebo Promises. Optimalizácia sa týka rýchleho vykonávania dopytov a efektívneho spracovania získaných dát.
Vláknové Modelovanie a Paralelizmus
Aj keď asynchrónnosť nie je to isté ako paralelizmus, často sa používajú spoločne. V prostrediach, kde je možnosť využiť viacero jadier procesora, je dôležité efektívne riadiť, kedy a ako sa asynchrónne operácie spustia na rôznych vláknach.
- Worker Threads (napr. v Node.js): Worker vlákna umožňujú vykonávať výpočtovo náročné úlohy v oddelenom vlákne, čím sa uvoľňuje hlavné vlákno pre spracovanie UI alebo iných udalostí. Komunikácia medzi hlavným vláknom a worker vláknom často prebieha prostredníctvom správ, ktoré sú spracované callbackmi.
- Task Queues: V systémoch s viacerými procesmi alebo servermi sa často používajú task queues (fronty úloh). Aplikácia odošle úlohu do frontu a worker proces ju spracuje asynchrónne. Callbacky môžu byť použité na notifikáciu o dokončení úlohy alebo o jej zlyhaní.
Pokročilé Techniky a Best Practices
Okrem základných techník existujú aj pokročilejšie prístupy, ktoré môžu ešte viac vylepšiť výkon a spoľahlivosť vášho asynchrónneho kódu.
1. Nastroje na Profilovanie a Debugging
Efektívna optimalizácia začína pochopením, kde presne dochádza k problémom. Nástroje na profilovanie vám pomôžu identifikovať úzke hrdlá vo vašom kóde, ako sú dlho trvajúce callbacky alebo nadmerná spotreba pamäte.
- Profilovacie nástroje: Využite špecifické profilovacie nástroje pre váš programovací jazyk a prostredie (napr. Chrome DevTools pre JavaScript,
cProfilev Pythone, Visual Studio Profiler pre .NET). - Logovanie: Dobre implementované logovanie vám môže poskytnúť cenné informácie o priebehu asynchrónnych operácií a o tom, kedy a ako sa spustili callbacky.
2. Patterny pre Robustné Asynchrónne Aplikácie
Niektoré dizajnové vzory boli špecificky vyvinuté na riešenie problémov spojených s asynchrónnym programovaním.
- Event Sourcing: V tomto vzore sa všetky zmeny stavu systému zaznamenávajú ako sekvencia událostí. Toto môže byť veľmi užitočné pre auditovanie, obnovu systému a pre vytváranie rôznych pohľadov na dáta.
- Command Query Responsibility Segregation (CQRS): Tento vzor oddeľuje operácie, ktoré menia stav (commands), od operácií, ktoré čítajú dáta (queries). V asynchrónnom prostredí to môže pomôcť optimalizovať obe cesty nezávisle.
3. Efektívne Využitie Úloh a Vlákien
- Throttling a Debouncing: Tieto techniky sú užitočné, keď chcete obmedziť, ako často sa môže funkcia (callback) vykonať.
- Throttling: Zabezpečí, že funkcia sa vykoná maximálne raz za určitý časový interval (napr. spracovanie udalosti scrollu na webovej stránke).
- Debouncing: Zabezpečí, že funkcia sa vykoná až po tom, ako uplynul určitý čas od posledného vyvolania (napr. vyhľadávanie pri písaní do textového poľa).
- Využitie Poolov: Pre opakované vykonávanie podobných asynchrónnych úloh môže byť efektívnejšie používať pooly vlákien alebo procesov. Namiesto vytvárania nového vlákna pre každú úlohu, sa využívajú predpripravené „worker“ jednotky.
4. Konkurenčné Úlohy a Ich Správa
Pri spracovaní viacerých asynchrónnych úloh naraz je kľúčové vedieť, ako ich efektívne riadiť.
Promise.all/asyncio.gather: Tieto konštrukcie umožňujú čakať na dokončenie viacerých Promises/Tasks súčasne. Ak ktorákoľvek z nich zlyhá, celá operácia zlyhá (v závislosti od implementácie).Promise.race/asyncio.wait(sreturn_when=FIRST_COMPLETED): Tieto umožňujú vrátiť výsledok alebo signál o dokončení prvej úlohy, ktorá sa úspešne dokončí. Toto je užitočné napríklad pri pokuse o pripojenie k viacerým serverom naraz a použití toho prvého, ktorý odpovie.
Tabuľka 1: Porovnanie Metód Spracovania Asynchrónnych Operácií
| Metóda | Popis | Výhody | Nevýhody | Kedy použiť |
|---|---|---|---|---|
| Callbacky | Funkcia odovzdaná ako argument, ktorá sa vykoná neskôr. | Široká podpora, jednoduché pre základné použitie. | Náchylné na "callback hell", zložité spracovanie chýb. | Jednoduché, menej vnořené asynchrónne operácie. |
| Promises | Objekty reprezentujúce konečné dokončenie (alebo zlyhanie) asynchrónnej operácie a jej výsledok. | Lepšia správa chýb, čitateľnejšie reťazenie operácií. | Stále môže byť zložité pre veľmi komplexné toky. | Stredne zložité asynchrónne operácie, kde je potrebná lepšia správa chýb ako pri callbackoch. |
| Async/Await | Syntaxická nadstavba nad Promises, ktorá umožňuje písať asynchrónny kód ako synchronný. | Najlepšia čitateľnosť, jednoduché spracovanie chýb (try-except), menej boilerplate. | Vyžaduje podporu v jazyku/prostredí. | Všetky typy asynchrónnych operácií, kde je prioritou čitateľnosť a jednoduchá správa chýb. |
| Event Emitters | Objekty, ktoré umožňujú emitovať a počúvať na udalosti. | Flexibilný model pre komunikáciu medzi komponentmi. | Vyžaduje disciplínu pri definovaní a spracovaní udalostí. | Reakcia na rôzne typy udalostí, komunikácia medzi modulmi. |
„Pri optimalizácii callback rutín ide o dosiahnutie rovnováhy medzi výkonom, čitateľnosťou a jednoduchosťou údržby kódu.“
Budúcnosť Asynchrónneho Spracovania Udalostí
Oblasť asynchrónneho spracovania udalostí sa neustále vyvíja. S rastúcim dôrazom na výkon, škálovateľnosť a efektivitu sa objavujú nové techniky a nástroje.
- WebAssembly (Wasm): WebAssembly otvára dvere k spusteniu vysoko výkonného kódu napísaného v jazykoch ako C++, Rust alebo Go priamo v prehliadači alebo na serveri. Toto môže byť využité na urýchlenie náročných asynchrónnych úloh.
- Actor Model: Model aktérov, ktorý sa používa v niektorých programovacích jazykoch a frameworkoch (napr. Akka v Jave/Scala, Erlang), poskytuje ďalší prístup k súbežnému a asynchrónnemu programovaniu, kde sú jednotkami komunikácie „aktori“, ktorí si vymieňajú správy.
- Serverless Computing: Architektúry bez servera (serverless) sa silno spoliehajú na asynchrónne spracovanie udalostí. Funkcie sú aktivované udalosťami (napr. HTTP požiadavka, záznam v databáze) a musia reagovať rýchlo a efektívne.
Tabuľka 2: Kľúčové Koncepty v Asynchrónnom Spracovaní
| Koncept | Popis | Význam pre Optimalizáciu |
|---|---|---|
| Asynchrónnosť | Schopnosť vykonávať operácie bez blokovania hlavného vykonávacieho vlákna; umožňuje aplikácii zostať responzívnou. | Základ pre výkonné a užívateľsky prívetivé aplikácie. Neoptimalizovaná asynchrónnosť môže viesť k problémom. |
| Event Loop | Jadro mnohých asynchrónnych runtime prostredí, ktoré spravuje a vykonáva udalosti a ich handlery. | Efektívny event loop je kľúčový. Príliš dlhé vykonávanie handlerov môže zahlcovať event loop. |
| Callback | Funkcia odovzdaná inej funkcii, ktorá sa má vykonať neskôr, typicky po dokončení asynchrónnej operácie. | Základný stavebný kameň. Optimalizácia sa týka minimalizácie práce vykonávanej v callbacku a jeho čitateľnosti. |
| Promise/Future | Objekt reprezentujúci prebiehajúcu alebo budúcu hodnotu asynchrónnej operácie. | Poskytujú štruktúrovaný spôsob správy asynchrónnych výsledkov a chýb, čo uľahčuje reťazenie operácií a predchádza callback hell. |
| Async/Await | Syntaxická nadstavba, ktorá robí asynchrónny kód čitateľnejším a ľahšie spravovateľným, podobným synchronnému kódu. | Výrazne zlepšuje čitateľnosť a zjednodušuje správu chýb, čo vedie k menej chybnému a ľahšie udržiavateľnému kódu. |
| Worker Threads | Oddelené vykonávacie vlákna, ktoré umožňujú vykonávať výpočtovo náročné úlohy paralelne bez blokovania hlavného vlákna. | Umožňujú presunúť dlhotrvajúce, výpočtovo náročné operácie z hlavného vlákna, čím sa zvyšuje celková responzivita aplikácie. |
| Task Queues | Systémy na správu úloh, ktoré umožňujú asynchrónne spracovanie úloh naprieč procesmi alebo servermi. | Umožňujú distribuované a škálovateľné spracovanie úloh, kde sa spracovanie udalostí môže rozdeliť medzi viacero workerov. |
„Budúcnosť patrí aplikáciám, ktoré dokážu elegantne a efektívne spravovať tok informácií v reálnom čase, a to je presne to, čo nám asynchrónne spracovanie udalostí umožňuje.“
FAQ: Často Kladené Otázky o Asynchrónnom Spracovaní a Callbackoch
Ako sa líši asynchrónne spracovanie od synchronného?
Synchronné spracovanie znamená, že operácie sa vykonávajú postupne, jedna po druhej. Ak jedna operácia trvá dlho, celý program čaká, kým sa nedokončí. Asynchrónne spracovanie umožňuje programu pokračovať v práci na iných úlohách, zatiaľ čo dlhotrvajúca operácia prebieha na pozadí. Keď sa asynchrónna operácia dokončí, spustí sa špecifická funkcia (callback), ktorá spracuje jej výsledok.
Čo je to „Callback Hell“ a ako sa mu vyhnúť?
„Callback Hell“ je situácia, keď sú callback rutiny hlboko vnořené jedna do druhej, čo vedie k ťažko čitateľnému a spravovateľnému kódu. Vyhnúť sa mu dá použitím modernejších konštrukcií ako Promises, async/await, alebo rozdelením zložitých procesov na menšie, opakovane použiteľné funkcie.
Sú Promises a async/await vždy lepšie ako tradičné callbacky?
Vo väčšine prípadov áno, najmä pre zložitejšie asynchrónne toky. Promises a async/await poskytujú lepšiu štruktúru, čitateľnosť a správu chýb. Avšak pre veľmi jednoduché asynchrónne operácie môžu byť aj tradičné callbacky dostatočné a niekedy dokonca priamočiarejšie. Dôležité je vybrať nástroj, ktorý najlepšie zodpovedá komplexnosti úlohy.
Ako môžem efektívne spracovať chyby v asynchrónnom kóde?
V prípade callbackov je potrebné chyby explicitne kontrolovať v každom callbacku. S Promises sa chyby spracúvajú pomocou metód ako .catch() alebo v rámci reťazenia .then(). S async/await je možné použiť štandardné try-catch bloky, čo výrazne zjednodušuje správu chýb. Vždy je dobré mať aj centralizovaný mechanizmus na logovanie a notifikáciu o chybách.
Aký je rozdiel medzi asynchrónnosťou a paralelizmom?
Asynchrónnosť sa týka spôsobu, akým program spravuje viaceré operácie bez blokovania hlavného vlákna. Paralelizmus sa týka súčasného vykonávania viacerých úloh, zvyčajne na viacerých jadrách procesora. Asynchrónnosť môže byť implementovaná aj bez paralelizmu (napr. pomocou event loopu na jednom vlákne), ale často sa s ňou kombinuje na dosiahnutie maximálneho výkonu.
