2.1 Promiselərin yaradılması
Promiselər (Promises) — asinxron əməliyyatın uğurla tamamlanmasını (və ya uğursuzluğunu) və onun nəticəsini təmsil edən obyektdir. Onlar ES6 (ECMAScript 2015)-də təqdim edilib və JavaScript-də asinxron kodla işləməyin standart üsuluna çevrildilər.
Əsas konseptlər
Promise üç vəziyyətdən birində ola bilər:
- Pending (gözləmə): ilkin vəziyyət, nə yerinə yetirilib, nə də rədd edilib.
- Fulfilled (yerinə yetirilib): əməliyyat uğurla tamamlanıb.
- Rejected (rədd edilib): əməliyyat xəta ilə tamamlanıb.
Promisenin yaradılması
Promise Promise
konstruktoru vasitəsilə yaradılır. Bu konstruktor bir executor function (icraedici funksiya) qəbul edir. Bu funksiya iki arqument qəbul edir: resolve
və reject
. Bu funksiyanın içində asinxron kod yerinə yetirilir və uğurla tamamlanma halında resolve
çağırılır, xəta halında isə reject
çağırılır.
Syntax:
const promise = new Promise((resolve, reject) => {
// Asinxron əməliyyat
if (/* uğurlu tamamlanma */) {
resolve(value); // Uğur
} else {
reject(error); // Xəta
}
});
Promisenin yaradılmasına nümunə:
const myPromise = new Promise((resolve, reject) => {
const success = true; // Uğurlu yerinə yetirilmə şərti
if (success) {
resolve('Əməliyyat uğurla tamamlandı');
} else {
reject('Əməliyyat uğursuz oldu');
}
});
2.2 Promis-lərin istifadəsi
then metodu
then
metodu promis-in uğurla icra olunmasını işləmək üçündür. Bu, iki funksiyanı qəbul edir: birincisi uğurlu icranı işləmək, ikincisi isə səhvləri işləmək üçün. Amma adətən səhvləri işləmək üçün catch
metodu istifadə olunur.
then metodunun istifadəsinə nümunə:
myPromise.then(
(successMessage) => {
console.log(successMessage); // Ekrana çıxacaq: Əməliyyat uğurlu oldu
},
(errorMessage) => {
console.error(errorMessage); // Səhv olduqda bu çağırılacaq
}
);
catch metodu
catch
metodu promis-in səhvlərini işləmək üçündür. Bu, yalnız bir funksiya qəbul edir və promis rədd edildikdə çağırılır.
catch metodunun istifadəsinə nümunə:
myPromise
.then((successMessage) => {
console.log(successMessage);
})
.catch((errorMessage) => {
console.error(errorMessage); // Çağırılacaq: Əməliyyat uğursuz oldu
});
finally metodu
finally
metodu, promis nəticəsindən (uğurlu ya da uğursuz) asılı olmayaraq kod icra etmək üçün istifadə olunur. Bu, heç bir argument qəbul etmir və promis icrası və ya rədd edilməsindən sonra hər zaman işləyir.
finally metodunun istifadəsinə nümunə:
myPromise
.then((successMessage) => {
console.log(successMessage);
})
.catch((errorMessage) => {
console.error(errorMessage);
})
.finally(() => {
console.log('Əməliyyat tamamlandı'); // Hər zaman çağırılacaq
});
2.3 Promise istifadə nümunələri
Nümunə 1: Promise istifadə edərək asinxron əməliyyat
Timer ilə asinxron əməliyyatın simulyasiyası.
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve('Asinxron əməliyyat uğurla tamamlandı');
} else {
reject('Asinxron əməliyyat uğursuz oldu');
}
}, 2000);
});
}
asyncOperation()
.then((message) => {
console.log(message);
})
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log('Asinxron əməliyyat tamamlandı');
});
Nümunə 2: Promise'lərin ardıcıllıqla icrası
Ardıcıllıqla asinxron əməliyyatların simulyasiyası.
function firstOperation() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Birinci əməliyyat tamamlandı');
resolve('Birinci nəticə');
}, 1000);
});
}
function secondOperation(result) {
return new Promise((resolve) => {
setTimeout(() => {
console.log('İkinci əməliyyat tamamlandı');
resolve(`İkinci nəticə, alındı: ${result}`);
}, 1000);
});
}
firstOperation()
.then((result) => {
return secondOperation(result);
})
.then((finalResult) => {
console.log(finalResult);
})
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log('Hər iki əməliyyat tamamlandı');
});
Nümunə 3: Promise.all ilə paralel icra
Paralel asinxron əməliyyatların simulyasiyası.
function operationOne() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Birinci əməliyyat tamamlandı');
resolve('Birinci nəticə');
}, 1000);
});
}
function operationTwo() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('İkinci əməliyyat tamamlandı');
resolve('İkinci nəticə');
}, 1500);
});
}
Promise.all([operationOne(), operationTwo()])
.then((results) => {
console.log('Bütün əməliyyatlar tamamlandı');
console.log(results); // Nəticə çıxaracaq: ['Birinci nəticə', 'İkinci nəticə']
})
.catch((error) => {
console.error('Əməliyyatlardan biri uğursuz oldu', error);
});
GO TO FULL VERSION