Async/Await: Tiszta és olvasható aszinkron kód JavaScriptben
Bár a Promise objektumok és a .then() / .catch() láncolat jelentős minőségi javulást hozott a hagyományos callbackekhez képest, a kód komplexebb üzleti logikák esetén (ahol sok az elágazás vagy a változó) továbbra is hajlamos volt strukturálisan szétesni. Erre a problémára nyújtott tökéletes megoldást az ES2017 (ES8) szabványban bevezetett async/await szintaxis.
Mit csinál pontosan az Async/Await?
Az async/await egy nyelvi konstrukció (syntactic sugar) a Promise-ok felett. Lehetővé teszi, hogy az aszinkron kódot úgy írjuk meg, mintha az szekvenciális (szinkron) módon, sorról sorra futna. Ez nem változtatja meg a háttérben futó Event Loop non-blocking (nem blokkoló) működését, csupán egy hihetetlenül tiszta és intuitív olvasási réteget biztosít a fejlesztőnek.
Gyakorlati alkalmazás és Try/Catch hibakezelés
A használat szabályai egyszerűek: Egy függvény elé ki kell tennünk az async kulcsszót. Csak egy ilyen függvényen belül használhatjuk az await szót, amit a Promise-t visszaadó aszinkron műveletek elé teszünk. A hibakezelést a hagyományos, szinkron kódból is ismert try...catch blokkokkal oldhatjuk meg, ami sokkal természetesebb, mint a .catch() láncolat.
// Az 'async' kulcsszó jelzi, hogy a függvény aszinkron műveleteket tartalmaz
async function felhasznaloiAdatokLekerdezese(userId) {
// Try blokk a sikeres ág számára
try {
console.log("Adatok lekérése folyamatban...");
// Az 'await' megállítja a függvény (és csak a függvény!) futását,
// amíg a fetch Promise-a fel nem oldódik
const response = await fetch(`https://api.example.com/users/${userId}`);
// HTTP hiba státuszkódok manuális ellenőrzése
if (!response.ok) {
throw new Error(`Szerver hiba! Státuszkód: ${response.status}`);
}
// A JSON konvertálás szintén aszinkron, itt is kell az 'await'
const adat = await response.json();
console.log("Sikeres lekérdezés! Felhasználó neve:", adat.name);
return adat; // Egy Promise-ba csomagolva tér vissza!
} catch (error) {
// A Catch blokk elkapja mind a hálózati, mind a manuálisan dobott (throw) hibákat
console.error("Hiba történt a folyamat során:", error.message);
} finally {
console.log("A lekérdezési kísérlet befejeződött.");
}
}
felhasznaloiAdatokLekerdezese(1);
Összegzés
Az async/await használatával a kód felépítése felülről lefelé haladó, lineáris marad. Nem kell bonyolult, egymásba ágyazott zárójelekkel (arrow functions) bajlódnunk. Ez drasztikusan megkönnyíti a hibakeresést (debugging), a kód áttekinthetőségét és karbantartását a hosszú távú projektekben.
Gyakran Ismételt Kérdések (GYIK)
Használhatom az await-et az async függvényen kívül?
Korábban nem lehetett, de a legújabb Node.js és böngésző verziók már támogatják az úgynevezett Top-level await funkciót (ES2022). Ez azt jelenti, hogy ES modulok (type="module") esetében a fájl legfelső szintjén is írhatsz await kulcsszót, ami rendkívül hasznos például adatbázis-kapcsolatok inicializálásánál.