JavaScript-də Promis
-
Promis (Promise) — JavaScript-də asinxron kodun yazılması və işlənməsi üçün istifadə olunan xüsusi bir obyektdir. Asinxron funksiyalar, nəticə olaraq bir Promise obyekti qaytarır. Bu obyektin içində, ya artıq icra olunmuş, ya da gələcəkdə icra olunacaq bir əməliyyatın nəticəsi saxlanılır.
Promis üç əsas vəziyyətdə ola bilər:
- Pending (Gözləyən) — Başlanğıc vəziyyəti, əməliyyat başlanıb.
- Fulfilled (Tamamlanmış) — Nəticə əldə edilib.
- Rejected (İmtina edilmiş) — Xəta baş verib.
Promisin vəziyyəti yalnız bir dəfə dəyişə bilər; yəni, pending vəziyyətindən yalnız ya fulfilled, ya da rejected vəziyyətinə keçə bilər.
Promis necə yaradılır?
Promis, konstruktor vasitəsilə yaradılır. Konstruktor daxilində bir “executor” funksiyası verilir. Bu funksiya, promis yaradıldıqdan dərhal sonra işə düşür və asinxron əməliyyatı yerinə yetirir. Hədəf, əməliyyatın nəticəsini fulfilled (uğurlu) və ya rejected (xəta) vəziyyətinə gətirməkdir.
const promise = new Promise(function (resolve, reject) { // Asinxron əməliyyat: navigator.geolocation.getCurrentPosition(function (data) { resolve(data); // Tamamlanmış nəticə }); }); const errorPromise = new Promise(function (resolve, reject) { reject(new Error('Xəta')); // Xəta baş verdi });
- resolve: Promisi fulfilled vəziyyətinə gətirən funksiya.
- reject: Promisi rejected vəziyyətinə gətirən funksiya.
Promis ilə işləmə
then(), catch() və finally() metodları, promisin vəziyyətinin dəyişməsi ilə əlaqəli kodu icra etmək üçün istifadə olunur.
- then() metodu asinxron əməliyyatın uğurlu nəticəsi ilə işləmək üçün istifadə edilir.
fetch(`https://swapi.dev/api/films/${id}/`) .then(function (movies) { renderList(movies); })
- catch() metodu əməliyyat zamanı xətalarla işləmək üçün istifadə edilir.
fetch(`https://swapi.dev/api/films/${id}/`) .catch(function (error) { renderErrorMessage(error); });
- finally() metodu isə asinxron əməliyyatın tamamlanmasından sonra, istənilən halda işləyəcək kodu icra edir.
let isLoading = true; fetch(`https://swapi.dev/api/films/${id}/`) .finally(function () { isLoading = false; });
Metodların zəncirlənməsi
then(), catch() və finally() metodları zəncirlənərək istifadə edilə bilər, beləliklə asinxron əməliyyatların ardıcıl yerinə yetirilməsi təmin edilir.
fetch(`https://swapi.dev/api/films/${id}/`) .then(function (movies) { renderList(movies); }) .catch(function (err) { renderErrorMessage(err); }) .finally(function () { isLoading = false; });
Zəncirlənmiş metodlar asinxron əməliyyatların nəticələrinə uyğun hərəkət etməyə imkan verir, məsələn, bir filmi göstərmək və sonra onun əsas qəhrəmanını əldə etmək.
Digər Promis metodları
Bəzən mövcud bir nəticəni Promis-ə çevirmək lazımdır. Bu zaman Promise.resolve() metodundan istifadə olunur.
const happyDog = Promise.resolve('🐶'); happyDog.then(function (dog) { console.log(dog); // 🐶 });
Promise.reject() metodu, bir xətanı Promis obyektinə çevirmək üçün istifadə olunur.
const sadDog = Promise.reject('🐶'); sadDog.catch(function (dog) { console.log(dog); // 🐶 }) .then(function () { console.log('ok'); });
Asinxron funksiyalar və Promis
Promis həmçinin asinxron funksiyaları yaratmaq üçün istifadə edilir. Aşağıdakı kimi bir funksiya ilə asinxron əməliyyatlar icra edilə bilər:
function earnAllMoney() { return new Promise(function (resolve, reject) { const result = tryEarnAllMoney(); if (result.ok) { resolve(result); } else { reject(new Error(result)); } }); }
Sxemli Promislər
Bir promis, başqa bir promisi “içinə alarsa”, onlar birləşəcək və sadəcə bir promis olacaq.
const promise = Promise.resolve(Promise.resolve(Promise.resolve('🐶'))); promise.then(console.log); // 🐶
Nəticə
Promis, JavaScript-də asinxron əməliyyatların daha rahat və oxunaqlı idarə olunmasını təmin edir. then(), catch(), finally() metodları ilə biz asinxron əməliyyatları idarə edə bilərik. Bu metodlar birləşdirilərək mürəkkəb asinxron əməliyyatlar üçün uyğun həllər yaradır.
P.S. Ümumiyyətlə, Promis olduqça geniş mövzudur. Burada sadəcə kiçik giriş olaraq paylaşdığım yazını aşağıdakı formadan istifadə edib genişləndirə bilərsiz.
Bilik paylaşdıqca artan bir sərvətdir