4.1 Async açar sözü
JavaScript-də asinxron funksiyalar asinxron kod yazmağa imkan verir ki, bu kod sinxron kimi görünsün və oxunsun. ECMAScript 2017 (ES8)-də təqdim edilən async
və await
açar sözləri promise-lərlə işləməyi daha rahat edir və kodu daha anlaşılan və idarə edilə bilən edir.
Əsas konsepsiyalar
async
açar sözü funksiyanı elan etməzdən əvvəl yazılırsa, bu onun asinxron olduğunu göstərir. Asinxron funksiya həmişə promise qaytarır, hətta əgər onun daxilində return
operatoru açıq şəkildə göstərilməsə belə. Əgər funksiya bir dəyər qaytarırsa, bu dəyər avtomatik olaraq promise-ə bükülür.
Sintaksis:
async function ad() {
// funksiyanın kodu
}
Nümunə:
async function greet() {
return 'Salam, dünya!';
}
greet().then((message) => {
console.log(message); // Çıxış: Salam, dünya!
});
4.2 Açar sözü await
await
açar sözü asinxron funksiyanın içində promisin tamamlanmasına qədər onun icrasını dayandırmaq üçün istifadə olunur. await
yalnız async
açar sözü ilə elan edilmiş funksiyaların içində istifadə oluna bilər.
Sintaksis:
let result = await
promise;
Nümunə:
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function greet() {
await delay(2000);
return 'Salam, dünya!';
}
async function displayGreeting() {
const message = await greet();
console.log(message); // Çap edəcək: Salam, dünya! 2 saniyə sonra
}
displayGreeting();
4.3 Async və await istifadəsinin nümunələri
Nümunə 1: Bir neçə promisin gözləndiyi asinxron funksiya
function fetchData1() {
return new Promise((resolve) => setTimeout(() => resolve('Data 1'), 1000));
}
function fetchData2() {
return new Promise((resolve) => setTimeout(() => resolve('Data 2'), 2000));
}
async function fetchAllData() {
const data1 = await fetchData1();
console.log(data1); // Bu çıxacaq: Data 1 1 saniyədən sonra
const data2 = await fetchData2();
console.log(data2); // Bu çıxacaq: Data 2 2 saniyədən sonra
}
fetchAllData();
Nümunə 2: Asinxron əməliyyatların paralel icrası
Bir neçə asinxron əməliyyatı paralel yerinə yetirmək üçün Promise.all()
və await
istifadə edə bilərsən.
function fetchData1() {
return new Promise((resolve) => setTimeout(() => resolve('Data 1'), 1000));
}
function fetchData2() {
return new Promise((resolve) => setTimeout(() => resolve('Data 2'), 2000));
}
async function fetchAllData() {
const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
console.log(data1); // Bu çıxacaq: Data 1 2 saniyədən sonra
console.log(data2); // Bu çıxacaq: Data 2 2 saniyədən sonra
}
fetchAllData();
Nümunə 3: try...catch ilə səhvlərin idarə olunması
Asinxron funksiyalar try...catch
bloklarını səhvləri idarə etmək üçün istifadə etməyə imkan verir, bu da kodu daha oxunaqlı və idarə olunabilən edir.
function fetchDataWithError() {
return new Promise((resolve, reject) => setTimeout(() => reject('Səhv baş verdi'), 1000));
}
async function fetchData() {
try {
const data = await fetchDataWithError();
console.log(data);
} catch (error) {
console.error('Səhv:', error); // Bu çıxacaq: Səhv: Səhv baş verdi 1 saniyədən sonra
}
}
fetchData();
Nümunə 4: Async və await-in sinif metodlarında istifadəsi
Asinxron funksiyaları siniflərin metodlarında da istifadə etmək mümkündür.
class DataFetcher {
async fetchData() {
const data = await new Promise((resolve) => setTimeout(() => resolve('Fetched Data'), 1000));
return data;
}
}
const fetcher = new DataFetcher();
fetcher.fetchData().then((data) => {
console.log(data); // Bu çıxacaq: Fetched Data 1 saniyədən sonra
});
Nümunə 5: Asinxron iteratorlar
Asinxron iteratorlar qeyri-sinxron daxil olan məlumat axınları ilə işləməyə imkan verir.
async function* asyncGenerator() {
let i = 0;
while (i < 3) {
await new Promise((resolve) => setTimeout(resolve, 1000));
yield i++;
}
}
async function iterateAsyncGenerator() {
for await (let value of asyncGenerator()) {
console.log(value); // Bu çıxacaq: 0, 1 və 2 hər biri 1 saniyəlik intervalla
}
}
iterateAsyncGenerator();
GO TO FULL VERSION