Dart Asinxron funksiyalar va async, await operatorlari

async va await operatorlari asinxron kod yozishni osonlashtiradi. async va await dan foydalanish Future API-dan to'g'ridan-to'g'ri foydalanishdan qochish imkonini beradi, xususan, uning then va catchError usullaridan.

Birinchidan, keling, Future API yordamida asinxronizatsiyasiz va kutmasdan qanday kod yozishni ko'rib chiqamiz:

void my_func() {
print("my_func funksiyasining boshlanishi");
Future<String> messageFuture = getMessage();
messageFuture.then((message){
print("Xabar keldi: $message");
});
print("my_func funksiyasini bajarish");
}

Future<String> getMessage() {
return Future.delayed(Duration(seconds: 3), () => "Salom Uzbekdevs");
}

void main () {
my_func();
print("Asosiy funksiyani bajarish");
}

getMessage() orqali xabarni qabul qilishi kerak bo'lgan funksiya aniqlanadi. Uzoq muddatli operatsiyani bajarilishini kutish uchun biz 3 soniya kechikish o'rnatdik. Lekin, aslida, bu tarmoq so'rovlarini, ma'lumotlar bazasi murojaatlarini, fayllarni o'qish-yozishni va uzoq vaqt talab qiladigan boshqa og'ir ishlarni bajaradigan funksiya bo'lishi mumkin.

Aytaylik, my_func() funksiyasida biz Future obyektini qaytaruvchi getMessage funksiyasini chaqiramiz. Uning keyingi usuli orqali biz kerakli xabarni olamiz va uni ekranga chiqaramiz. Asosiy funksiyada biz my_func deb nomlaymiz.

>> my_func funksiyasining boshlanishi >> my_func funksiyasini bajarish >> Asosiy funksiyani bajarish >> Xabar keldi: Salom Uzbekdevs

E'tibor bering, my_func funksiyasi Future tugashidan oldin o'z bajarilishini yakunlaydi.

Endi async va await yordamida bir xil kodni qayta yozamiz :

Future<void> my_func() async {
print("my_func funksiyasining boshlanishi");
String xabar = await getMessage();
print("Xabar keldi: $xabar");
print("my_func funksiyasini bajarish");
}

Future<String> getMessage() {
return Future.delayed(Duration(seconds: 3), () => "Salom Uzbekdevs");
}

void main () {
my_func();
print("Asosiy funksiyani bajarish");
}

Uzoq muddatli ishlarni bajaradigan getMessage funksiyasi (bu holda xabarni qabul qilish) bir xil bo'lib qoladi. Asosiy o'zgarishlar xabarni olish uchun getMessage ni chaqiradigan my_func funksiyasiga tegishli. Endi u asinxron funksiya sifatida aniqlanadi. Buning uchun funksiya parametrlaridan soʻng async operatori koʻrsatiladi:

Future<void> my_func() async {

Asinxron funksiya - bu kamida bitta asinxron amalni o'z ichiga olgan funksiya (garchi u sinxron amallarni ham o'z ichiga olishi mumkin). Asinxron funksiya sinxron funksiyaga o'xshaydi, bundan tashqari u async va await operatorlaridan foydalanadi.

Asinxron funksiya await uchun birinchi chaqiruvdan oldin kelgan barcha kodlarni sinxron tarzda bajaradi. Bunday holda, quyidagi qator sinxron ravishda bajariladi:

print("my_func funksiyasining boshlanishi");

await ifodasi asinxron operatsiyani ifodalaydi. Asinxron operatsiya - bu boshqa amallarning bajarilishini bloklamaydigan va ularni bajarilgunga qadar davom ettirish imkonini beradigan operatsiya. Bu holda u:

String xabar = await getMessage();

await ifodasi odatda Future obyektini qaytaradi. Agar boshqa turdagi obyekt qaytarilsa, u avtomatik ravishda Futurega o'tkaziladi va Futureda saqlanadigan ushbu obyektni oddiy tayinlash operatsiyasi bilan olishimiz mumkin. Shunday qilib, getMessage() funksiyasi Future<String> ni qaytaradi, ya'ni Future ba'zi qatorlarni saqlaydi. Va tayinlash operatsiyasi orqali biz ushbu satrni xabar o'zgaruvchisiga o'tkazishimiz mumkin. Keyin esa biz boshqa operatsiyalarni bajara olamiz, masalan, konsolga chiqaramiz.

await ifodasi kerakli obyekt (bu holda satr) mavjud bo'lgunga qadar bajarishni to'xtatib turadi. Va asinxron getMessage funksiyasi uning bajarilishini boshlaydigan Future obyektini qaytaradi va biz await ifodasidan satr olganimizdan so'ng, my_func funksiyasi o'z bajarilishini davom ettiradi va qolgan kodni bajarishga kirishadi:

print("Xabar keldi: $xabar");
print("my_func funksiyasini bajarish");

Natijada, bu holda, ekranga quyidagicha chiqadi:

>> my_func funksiyasining boshlanishi >> my_func funksiyasini bajarish >> Asosiy funksiyani bajarish >> Xabar keldi: Salom Uzbekdevs

Shuni ta'kidlash kerakki, agar funksiya await dan foydalansa, u async kalit so'zi bilan aniqlanishi kerak. Shuni ham ta'kidlash joizki, asinxron funksiya bir nechta await ifodalarini o'z ichiga olishi mumkin. Bunda ular ketma-ket bajariladi: oldingisi tugagach, keyingi await ifodasi bajarila boshlaydi.

Asinxron asosiy funksiya

Asinxron operatsiyalarga murojaatlarni alohida asinxron funksiyalarda joylashtirish shart emas. Siz asosiy funksiyani ham asinxron qilishingiz mumkin:

Future<String> getMessage() {
return Future.delayed(Duration(seconds: 3), () => "Salom Uzbekdevs");
}

Future<void> main() async {
print("Asosiy funksiyaning boshlanishi");
String message = await getMessage();
print("Qabul qilingan xabar: $message");
print("Asosiy funksiyani bajarish va yakunlash");
}

Asosiy funksiyaning berilishida siz Future-ni ham olib tashlashingiz mumkin:

void main() async {
print("Asosiy funksiyaning boshlanishi");
String message = await getMessage();
print("Qabul qilingan xabar: $message");
print("Asosiy funksiyani bajarish va yakunlash");
}