Asinxron funksiyalar va operatorlar asinxronlanadi va kutiladi
So'nggi subversiyalar asinxron kod yozishni osonlashtirish uchun Dart-ga asinxron va kutish operatorlarini qo'shdi. Async-await-dan foydalanish Future API-dan to'g'ridan-to'g'ri foydalanishdan, xususan, keyin va catchError usullaridan xalos bo'lishga imkon beradi.
Birinchidan, keling, Future API yordamida asinxronsiz va kutmasdan kod yozishni ko'rib chiqamiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void doWork() {
print("Начало функции doWork");
Future messageFuture = getMessage();
messageFuture.then((message){
print("Получено сообщение: $message");
});
print("Завершение функции doWork");
}
Future getMessage() {
// имитация долгой работы с помощью задержки в 3 секунды
return Future.delayed(Duration(seconds: 3), () => "Hello Dart");
}
void main () {
doWork();
print("Выполнение функции main");
}
|
Bunday holda, getMessage () funktsiyasi aniqlanadi, u ba'zi xabarlarni qabul qilishi kerak. Uzoq muddatli ishlashni taqlid qilish uchun unda 3 soniya kechikish o'rnating. Lekin, aslida, bu tarmoq so'rovlarini, ma'lumotlar bazasiga kirishni, fayllarni o'qish-yozishni va uzoq vaqt talab qiladigan boshqa noqulay ishlarni bajaradigan funksiya bo'lishi mumkin.
Aytaylik, doWork () funksiyasida biz Future obyektini qaytaruvchi getMessage funksiyasini chaqiramiz. Uning keyingi usuli orqali biz kerakli xabarni olamiz va uni konsolga chop qilamiz. Asosiy funktsiyada doWork-ga qo'ng'iroq qiling.
Dasturning konsol chiqishi:
Начало функции doWork
Завершение функции doWork
Выполнение функции main
Получено сообщение: Hello Dart
E'tibor bering, doWork funksiyasi Future tugashidan oldin tugaydi.
Endi async-await yordamida bir xil kodni qayta yozamiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Future doWork() async {
print("Начало функции doWork");
String message = await getMessage();
print("Получено сообщение: $message");
print("Завершение функции doWork");
}
Future getMessage() {
// имитация долгой работы с помощью задержки в 3 секунды
return Future.delayed(Duration(seconds: 3), () => "Hello Dart");
}
void main () {
doWork();
print("Выполнение функции main");
}
|
Uzoq muddatli ishlarni bajaradigan getMessage funksiyasi (bu holda xabar oladi) o'zgarishsiz qoladi. Asosiy o'zgarishlar xabarni qabul qilish uchun getMessage-ni chaqiruvchi doWork funksiyasiga tegishli. Endi u asinxron sifatida aniqlanadi. Buning uchun funksiya parametrlari roʻyxatidan soʻng asinxron operatori koʻrsatiladi:
1
|
Future doWork() async {
|
Asinxron funksiya - bu kamida bitta asinxron operatsiyani o'z ichiga olgan funksiya (garchi u bilan birga sinxron operatsiyalar ham bo'lishi mumkin). Asinxron funksiya sinxron bo'lib ko'rinadi, bundan tashqari u asinxron va kutish operatorlaridan foydalanadi.
Asinxron funksiya kutish ifodasining birinchi chaqiruvigacha bo'lgan barcha kodlarni sinxron tarzda bajaradi. Bunday holda, quyidagi qator sinxron ravishda bajariladi:
1
|
print("Начало функции doWork");
|
Kutish ifodasi asinxron operatsiyani ifodalaydi. Asinxron operatsiya - bu boshqa amallarning bajarilishini bloklamaydigan va ularni oxirigacha bajarishga imkon beradigan operatsiya. Bunday holda, bular:
1
|
String message = await getMessage();
|
Kutish ifodasi odatda Future obyektini qaytaradi. Agar boshqa turdagi ob'ekt qaytarilsa, u avtomatik ravishda Future-ga o'raladi. Va Future-da saqlanadigan bu ob'ekt, biz oddiy tayinlash operatsiyasini olishimiz mumkin. Shunday qilib, getMessage () funksiyasi Future ni qaytaradi, ya'ni Future ba'zi qatorlarni saqlaydi. Va tayinlash operatsiyasi orqali biz ushbu satrni xabar o'zgaruvchisiga o'tkazishimiz mumkin. Keyin biz ushbu chiziq bilan biz xohlagan narsani qilishimiz mumkin, masalan, konsolga chiqish.
Kutish ifodasi kerakli ob'ekt (bu holda, satr) mavjud bo'lgunga qadar bajarishni to'xtatib turadi. Va asinxron getMessage funksiyasi uning bajarilishini boshlaydigan Future obyektini qaytaradi.
Va kutish ifodasidan satrni olganimizdan so'ng, doWork funktsiyasi o'z bajarilishini davom ettiradi va kodning qolgan qismini bajarishga o'tadi:
1
2
|
print("Получено сообщение: $message");
print("Завершение функции doWork");
|
Natijada, bu holda, konsol chiqishi quyidagicha ko'rinadi:
Начало функции doWork
Выполнение функции main
Получено сообщение: Hello Dart
Завершение функции doWork
Shuni ta'kidlash kerakki, agar funktsiya await dan foydalansa, u async kalit so'zi bilan aniqlanishi kerak. Shuni ham ta'kidlash joizki, asinxron funksiya bir nechta kutish iboralarini o'z ichiga olishi mumkin. Bunday holda, ular ketma-ket bajariladi: oldingisi tugagach, keyingi kutish ifodasi bajarila boshlaydi.
Qayta ishlashda xatolik
Agar uzoq muddatli operatsiyani bajarishda xatolik yuzaga kelsa, Future ob'ektida aniq ma'lumotlar o'rniga xato haqida ma'lumot bo'ladi. Ushbu vaziyatni hal qilish uchun try..catch blokiga kutish ifodasini qo'ying:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Future doWork() async {
print("Начало функции doWork");
try{
String message = await getMessage();
print("Получено сообщение: $message");
}
catch(e){
print("Произошла ошибка: $e");
}
print("Завершение функции doWork");
}
Future getMessage() {
// с помощью оператора throw имитируем возникновение ошибки
return Future.delayed(Duration(seconds: 3), () => throw "Сервер не отвечает");
}
void main () {
doWork();
print("Выполнение функции main");
}
|
Xatoni simulyatsiya qilish uchun biz otish operatorini chaqiramiz, shundan so'ng biz xato matnini ko'rsatamiz. try..catch konstruksiyasidagi asinxron funksiyada biz xatoni ushlay olamiz va uni hal qilamiz. Natijada, konsol chiqishi quyidagicha ko'rinadi:
Начало функции doWork
Выполнение функции main
Произошла ошибка: Сервер не отвечает
Завершение функции doWork
Fergana 2021
Do'stlaringiz bilan baham: |