JavaScript-da promislar bilan tanishish
Siz allaqachon bilasizki, asinxronlik uchun callback modelidan foydalanish osongina callback hell vaziyatiga olib keladi. Shuning uchun JavaScript-da promislar (promise) deb nomlangan yangi model kiritildi. Keling, ushbu modelni o'rganaylik.
Promis ob'ektni ifodalaydi, uning parametri sifatida funktsiya uzatiladi, uning ichida bizning asinxron kodimiz joylashgan bo'lishi kerak:
let promise = new Promise(function() {
// asinxron kod
});
Ko'rib turganingizdek, men promis ob'ektini
promise o'zgaruvchisiga yozdim. Kodning boshqa joyida
men ushbu o'zgaruvchiga then metodini
qo'llashim mumkin, unga funktsiyani uzatib,
ushbu promis yaratilganda yozilgan asinxron kod
tugagandan so'ng bajariladigan kod bilan:
promise.then(function() {
// asinxron kod tugaganda bajariladi
});
Bu chalkash tuyulishi mumkin, shuning uchun keling, misolni ko'rib chiqaylik. Menda quyidagi asinxron kod bor deb faraz qilaylik:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Faraz qilaylik, men unga asinxronlikning asosiy
vazifasini hal qilmoqchiman: taymer ishlagandan keyin ma'lum bir kodni bajarish. Bunda
men ushbu kodni taymerning o'zida joylashtirishni xohlamayman
va ushbu kodga qandaydir tarzda result o'zgaruvchisida yozilgan natija tushishini xohlayman.
Umuman olganda, biz bu vazifani oldingi
darslarda callback lar va obunalar orqali hal qilganmiz. Keling
endi buni promislar orqali qanday qilishni ko'rib chiqaylik.
Boshlash uchun asinxron kodimizni promisga o'rashimiz kerak:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Biroq, bu yetarli emas. Biz asinxron kodimiz tugaganligini aniq ko'rsatishimiz kerak. Bunda bizga parametr sifatida ko'rsatilgan funktsiyaning birinchi parametriga avtomatik ravishda tushadigan maxsus tugatish funktsiyasi yordam beradi:
let promise = new Promise(function(resolve) { // parametrni ko'rsatamiz
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Tugatish funktsiyasi yordamida biz promisga asinxron kod tugaganligini aniq ko'rsatishimiz mumkin. Buning uchun biz ushbu funktsiyani o'zimiz xohlagan joyda chaqirishimiz kerak:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // promisni tugatamiz
}, 3000);
});
Bunda, agar biz asinxron kodning qandaydir natijasini tashqariga uzatmoqchi bo'lsak, uni tugatish funktsiyamizning parametri sifatida uzatishimiz mumkin:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // natijani uzatamiz
}, 3000);
});
Albatta, oraliq o'zgaruvchisiz ham qilish mumkin:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
Endi biz har qanday boshqa joyda promisimizning
then metodini chaqirishimiz mumkin:
promise.then(function() {
// promis tugaganda ishlaydi
});
Agar biz xohlasak, promisning ishlash natijasi funktsiyaning birinchi parametriga tushadi:
promise.then(function(result) {
console.log(result); // natija massivini chiqaradi
});
Ichimida 5 soniya kechikish bo'lgan promis yarating,
shundan so'ng promis bajarilishi kerak, o'z natijasida qandaydir matn qaytaradi.
Ushbu matnni ekranga chiqaring.