Middle
Räägi mulle JavaScripti asünkroonsuse põhimõtetest.
sobes.tech AI
Vastus AI-lt
Asünkroonimise põhimõtted JavaScriptis põhinevad ühe lõngaga täitmise mudelil, kus ülesanded, mis võivad võtta kaua aega (näiteks võrgupäringud, ajastid), ei blokeeri peamist täitmisvoogu, võimaldades teostada teisi tegevusi. Seda saavutatakse järgmiste mehhanismide abil:
- Event Loop (Sündmuste tsükkel): mehhanism, mis pidevalt kontrollib sõnumijada ja täidab sealt ülesandeid. Kui asünkroonne operatsioon lõpeb, asetatakse selle callback ülesannete järjekorda.
- Callback Functions (Tagasikutsumise funktsioonid): funktsioonid, mis antakse teise funktsiooni argumentidena ja täidetakse pärast asünkroonse operatsiooni lõpetamist.
- Promises (Lubadused): objektid, mis esindavad asünkroonse operatsiooni lõplikku väärtust, mis võib olla edukalt täidetud (resolved) või tagasi lükatud (rejected). Need lihtsustavad asünkroonse koodi töötlemist, aidates vältida "callback hell".
- Async/Await: süntaksiline suhkrupulber promises'i peal, mis võimaldab kirjutada loetavamat, sünkroonset stiili asünkroonsele koodile. Funktsioonid, millele on märgitud
async, tagastavad alati promises'i.awaitoperaatorit saab kasutada ainultasyncfunktsioonide sees ja see peatab täitmise kuni promises täitmiseni.
Võrdlus:
| Lähenemine | Loetavus | Vea töötlemine | Paralleelne täitmine |
|---|---|---|---|
| Callbacks | Madal | Keeruline | Võib olla keeruline |
| Promises | Keskmine | Mugav | .all(), .race() |
| Async/Await | Kõrge | Mugav (try/catch) | Natuke keerulisem |
Näide promises kasutamisest:
fetch('/api/data') // Asünkroonne operatsioon
.then(response => response.json()) // Eduka täitmise töötlemine
.then(data => console.log(data)) // Andmete töötlemine
.catch(error => console.error('Viga:', error)); // Vea töötlemine
Näide Async/Await kasutamisest:
async function fetchData() {
try {
const response = await fetch('/api/data'); // Ootab promises'i
const data = await response.json(); // Ootab promises'i
console.log(data);
} catch (error) {
console.error('Viga:', error); // Vea töötlemine
}
}
fetchData();