JavaScript-də Sinxron Üslubda Promise-lər
Promise hell problemini həll etmək üçün xüsusi promise sintaksisi işlənib hazırlanmışdır, hansı ki, asinxron kodu daha asan - sinxron üslubda yazmağa imkan verir.
Gəlin onun öyrənilməsinə başlayaq. Əvvəlcə əvvəlki dərsdən kodu götürək:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 çap edəcək
});
}
func();
Əgər bizim getSmth funksiyamız
sinxron olsaydı, onda func funksiyasının kodunu
aşağıdakı kimi yenidən yaza bilərdik:
function func() {
let res = getSmth(2);
console.log(res); // 4 çap edəcək
}
getSmth funksiyası, lakin, asinxrondur,
ona görə də yuxarıda göstərilən kod işləməyəcək.
Amma, promise-lərin sinxron üslubundan istifadə edərək,
biz buna bənzər bir şey əldə edə bilərik. Gəlin bunu edək.
Əvvəlcə biz öz funksiyamızı
func xüsusi
async komandası ilə asinxron elan etməliyik:
async function func() {
}
Bundan sonra biz func funksiyasının daxilində
xüsusi await komandasından istifadə edə biləcəyik.
Bu komanda, promise-dən əvvəl yazıldıqda, JavaScript-i
promise yerinə yetirilənə qədər gözləməyə məcbur edəcək.
Bundan sonra komanda promise-in nəticəsini qaytaracaq,
və kodun icrası davam edəcək.
Bizim vəziyyətimizdə await yazmalıyıq
getSmth çağırışından əvvəl. Çünki bu funksiyanın
çağırışının nəticəsi promise olacaq, onda kodun sonrakı
icrası yalnız bu promise yerinə yetirildikdən sonra
davam edəcək. Yaxşı, promise-in nəticəsini dəyişənə yazmaq olar.
Gəlin təsvir ediləni edək:
async function func() {
let res = await getSmth(2);
console.log(res); // 4 çap edəcək
}
func();
Gəlin getSmth-i bir neçə dəfə çağıraq:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // 13 çap edəcək
}
func();
İndi isə getSmth-i dövr içərisində çağıraq:
async function func() {
let arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let elem of arr) {
sum += await getSmth(elem);
}
console.log(sum);
}
func();
Aşağıdakı kodu sinxron sintaksis vasitəsilə yenidən yazın:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();