Middle
Papaskink apie asinchroniškumo principus JavaScript'e.
sobes.tech AI
Atsakymas iš AI
Asinchroninio principai JavaScript pagrįsti viengubo srauto vykdymo modeliui, kur užduotys, kurios gali užtrukti ilgai (pavyzdžiui, tinklo užklausos, laikmačiai), neblokuoja pagrindinio vykdymo srauto, leidžiant vykdyti kitus veiksmus. Tai pasiekiama naudojant:
- Event Loop (Įvykių ciklas): mechanizmas, kuris nuolat tikrina žinučių eilę ir vykdo iš jos užduotis. Kai asinchroninė operacija baigiasi, jos callbackas įdedamas į užduočių eilę.
- Callback Functions (Kreipimosi funkcijos): funkcijos, kurios perduodamos kaip argumento kitai funkcijai ir vykdomos po asinchroninės operacijos pabaigos.
- Promises (Pasižadėjimai): objektai, kurie atstovauja galutinę asinchroninės operacijos reikšmę, kuri gali būti sėkmingai įvykdyta (resolved) arba atmesta (rejected). Jie palengvina darbą su asinchroniniu kodu, leidžiant išvengti "callback hell".
- Async/Await: sintaksinis cukrus virš promises, leidžiantis rašyti labiau skaitomą, sinchroninį stilių asinchroniniam kodui. Funkcijos, pažymėtos
async, visada grąžina promise. Operatoriusawaitgali būti naudojamas tikasyncfunkcijų viduje ir sustabdo vykdymą iki promise įvykdymo.
Palyginimas:
| Požiūris | Skaitymo patogumas | Klaidos tvarkymas | Paralele vykdymas |
|---|---|---|---|
| Callbacks | Žemas | Sudėtingas | Gali būti sudėtinga |
| Promises | Vidutinis | Patogu | .all(), .race() |
| Async/Await | Aukštas | Patogu (try/catch) | Šiek tiek sudėtingiau |
Pavyzdys naudojant promises:
fetch('/api/data') // Asinchroninė operacija
.then(response => response.json()) // Sėkmingo vykdymo apdorojimas
.then(data => console.log(data)) // Duomenų apdorojimas
.catch(error => console.error('Klaida:', error)); // Klaidos apdorojimas
Pavyzdys naudojant Async/Await:
async function fetchData() {
try {
const response = await fetch('/api/data'); // Laukiama promise
const data = await response.json(); // Laukiama promise
console.log(data);
} catch (error) {
console.error('Klaida:', error); // Klaidos apdorojimas
}
}
fetchData();