JavaScript-də Promise-lərə Giriş
Artıq bilirsiniz ki, asinxronluq üçün callback modelindən istifadə asanlıqla callback hell vəziyyətinə gətirib çıxarır. Buna görə də JavaScript-də promise (promise) adlı yeni bir model təqdim edildi. Gəlin bu modeli öyrənək.
Promise, parametr kimi ötürülən funksiyanın daxilində asinxron kodumuzu yerləşdirdiyimiz bir obyekti təmsil edir:
let promise = new Promise(function() {
// asinxron kod
});
Gördüyünüz kimi, promise obyektini promise dəyişəninə yazdım. Kodun başqa bir yerində, bu dəyişənə, yaradılan promise-in asinxron kodu tamamlandıqda icra olunacaq kodu ötürən funksiyanı ötürərək then metodunu tətbiq edə bilərəm:
promise.then(function() {
// asinxron kod tamamlandıqda icra olunacaq
});
Qulağa qarışıq gəlir, buna görə də bir nümunəyə baxaq. Tutaq ki, mənim belə bir asinxron kodum var:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Tutaq ki, onun üçün asinxronluğun əsas vəzifəsini həll etmək istəyirəm: taymer işə düşdükdən sonra müəyyən kodu icra etmək. Eyni zamanda, bu kodu birbaşa taymerin özünə yerləşdirmək istəmirəm və bu kodun daxilinə result dəyişənində yazdığım nəticənin bir şəkildə daxil olmasını istəyirəm.
Ümumiyyətlə, biz bu problemi əvvəlki dərslərdə callback-lər və abunəliklər vasitəsilə həll etmişik. Gəlin indi bunu promise-lər vasitəsilə necə etməyə baxaq.
Əvvəlcə asinxron kodumuzu promise içərisinə qoymalıyıq:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Lakin, bu kifayət deyil. Biz asinxron kodumuzun tamamlandığını aydın şəkildə göstərməliyik. Bunda bizə, göstərildiyi təqdirdə, funksiyanın birinci parametrinə avtomatik olaraq daxil olan xüsusi bir tamamlama funksiyası kömək edəcək:
let promise = new Promise(function(resolve) { // parametri göstəririk
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Tamamlama funksiyası vasitəsilə biz promise-ə asinxron kodun tamamlandığını aydın şəkildə göstərə bilərik. Bunun üçün bu funksiyanı bizim üçün lazım olan yerdə çağırmalıyıq:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // promise-i tamamlayırıq
}, 3000);
});
Eyni zamanda, asinxron kodun hansısa nəticəsini xaricə ötürmək istəyiriksə, onu tamamlama funksiyamızın parametri kimi ötürə bilərik:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // nəticəni ötürürük
}, 3000);
});
Əlbəttə ki, aralıq dəyişəndən qurtula bilərik:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
İndi kodun istənilən başqa yerində promise-imizin then metodunu çağıra bilərik:
promise.then(function() {
// promise tamamlandıqda işləyəcək
});
Promise-in iş nəticəsi, onu göstərməyə qərar versək, funksiyanın birinci parametrinə daxil olacaq:
promise.then(function(result) {
console.log(result); // nəticə massivini çap edəcək
});
5 saniyəlik gecikməsi olan bir promise edin, bundan sonra promise öz nəticəsi kimi bir mətn qaytararaq tamamlanmalıdır. Bu mətni ekranda çap edin.