Kelajak sinfi bilan ishlash
Dart-da asinxron kod yozish uchun asosiy sinf Future sinfidir. Keling, u qanday imkoniyatlarni taqdim etishini ko'rib chiqaylik.
Kelajak konstruktorlari
Future obyektini yaratish uchun uning konstruktorlaridan birini ishlatishingiz mumkin:
Kelajak (FutureOr hisoblash ()): Hisoblash funksiyasini asinxron bajarish uchun Timer.run usulidan foydalanadigan kelajakni yaratadi va uning natijasini qaytaradi.
FutureOr turi hisoblash funktsiyasi Future yoki T tipidagi ob'ektni qaytarishi kerakligini bildiradi. Masalan, Future ob'ektini olish uchun hisoblash funktsiyasi Future ni qaytarishi kerak. ob'ekt yoki int ob'ekti
Future.delayed (Duration davomiyligi, [FutureOr computation ()]): Birinchi Duration parametri orqali belgilangan vaqt kechikishidan keyin boshlanadigan Future obyektini yaratadi. Ikkinchi ixtiyoriy parametr bu kechikishdan keyin ishlash funksiyasini bildiradi.
Future.error (Ob'ekt xatosi, [StackTrace stackTrace]): sodir bo'lgan xato haqida ma'lumotni o'z ichiga olgan Future ob'ektini yaratadi.
Future.microtask (FutureOr hisoblash ()): scheduleMicrotask funksiyasidan foydalanib, hisoblash funksiyasini asinxron tarzda ishga tushiradigan va uning natijasini qaytaradigan Future obyektini yaratadi.
Future.sync (FutureOr hisoblash ()): Darhol chaqiriladigan hisoblash funktsiyasi natijasini o'z ichiga olgan Future ob'ektini yaratadi.
Future.value ([FutureOr value]): Qiymat qiymatini o'z ichiga olgan Future obyektini yaratadi.
Ba'zi konstruktorlardan foydalanish. Birinchi konstruktor:
1
2
3
4
5
6
7
|
void main() {
Future myFuture = Future(() {
print("Hello Future");
});
print("Main ends");
}
|
Bu yerda Anonim funksiya Future konstruktoriga uzatiladi, u hech qanday parametrlarni qabul qilmaydi va hech narsani qaytarmaydi, faqat qandaydir xabarni aks ettiradi. Bu yerda anonim funksiya ishlatilsa-da, biz uni to‘liq funksiyaga aylantira olamiz. Konsol chiqishi:
Main ends
Hello Future
Nomlangan Future.delayed () konstruktoridan foydalanish shunga o'xshash, faqat ikkinchi parametrdan funktsiyani bajarishga o'tishdan oldin ma'lum vaqtni (birinchi parametr bilan ko'rsatilgan) kutadi:
1
2
3
4
|
void main() {
Future future = Future.delayed(Duration(seconds: 3), () => print("Hello Future"));
print("Main ends");
}
|
Future.value () konstruktoridan foydalanish, agar siz Future tarkibidagi qiymatni allaqachon bilsangiz, undan foydalanish mumkin. Ushbu konstruktor, xususan, keshlashdan foydalanadigan veb-xizmatlarni yaratishda foydali bo'lishi mumkin.
1
|
Future future = Future.value(35);
|
Bu holda Future 35 raqamini oladi (garchi u har qanday ob'ekt bo'lishi mumkin). Va keyin dasturda biz kelajakdan bu qiymatni olishimiz mumkin.
Xato ob'ekti va ixtiyoriy parametr, iz stekini oladigan Future.error () konstruktoridan foydalanish:
1
|
Future future = Future.error(ArgumentError.notNull("input"));
|
Bunday holda, ArgumentError.notNull ("kirish") ifodasi xato ob'ekti sifatida ishlatiladi, bu kiritish argumenti null bo'lmasligi kerakligini aytadi.
Qiymat olinmoqda
Haqiqatda, Future tipi umumiy tur yoki umumiy tur bo'lib, u ma'lum bir tur - Future tomonidan yoziladi. Burchakdagi qavsdagi T harfi Kelajak olib boradigan qiymat turini ko'rsatadi.
Yuqoridagi holatlardan birini olaylik:
1
2
3
4
5
6
7
|
void main() {
Future future = Future(() {
print("Hello Future");
});
print("Main ends");
}
|
Bu yerda konstruktorga uzatiladigan funksiya hech narsani qaytarmaydi, u faqat konsolga qandaydir xabarni chop etadi. Shuning uchun, haqiqatda, bu erda biz nafaqat Future ob'ektini, balki Future
1
2
3
|
Future future = Future(() {
print("Hello Future");
});
|
Funktsiyani o'zgartiraylik - endi u satrni qaytarsin:
1
2
3
|
Future myFuture = Future(() {
return "Hello Future";
});
|
Funktsiya satrni qaytargani uchun Future obyekti String ob'ektini o'z ichiga oladi va Future turini ifodalaydi.
Xuddi shu narsa boshqa konstruktorlar uchun ham amal qiladi:
1
2
3
4
5
6
7
8
9
10
11
|
void main() {
Future future1 = Future(() {
return 23.5; // возвращает число double
});
Future future2 = Future.delayed(Duration(seconds: 3),
() => "Hello Future"); // возвращает строку
Future future3 = Future.value(35); // хранит число int
Future future4 = Future.value("Hello Dart"); // хранит строку
print("Main ends");
}
|
Qiymatni olish va kelajakni ishlatish
Yuqorida biz bir qator Future ob'ektlarini aniqladik. Ularni belgilashda ularning barchasi to'liq bo'lmagan holatda, ular faqat bajarilishi kerak. Ular allaqachon tugallangan va tugallangan holatga o'tgan paytni qanday tutish mumkin? Buning uchun Future-da aniqlangan usul mavjud. Bu usul Kelajak tugashi bilan ishga tushadigan qayta qo'ng'iroq funksiyasini qabul qiladi. Funktsiya Future dan olingan qiymatni yagona parametr sifatida qabul qiladi.
Quyidagi misolni ko'rib chiqing:
1
2
3
4
5
6
7
8
9
10
11
12
|
void main() {
Future future = Future(() {
print("Выполнение Future");
return "Hello Future"; // возвращаем строку
});
future.then((value){
print("Из Future получено значение: $value");
});
print("Main ends");
}
|
Bu yerda Future konstruktoriga berilgan funksiya satrni qaytaradi, shuning uchun kelajak Future turiga ega.
Keyin () usuli qiymat parametrini oladigan qayta qo'ng'iroq funktsiyasidan o'tadi - bu konstruktor bajarilganda qaytariladigan satr bo'ladi. Keyin funksiyaning o'zi ushbu natijaviy qiymatni konsolga chop etadi. Natijada biz quyidagi konsol chiqishini olamiz:
Main ends
Выполнение Future
Из Future получено значение: Hello Future
Xuddi shunday, biz boshqa turdagi qiymatlarni olishimiz mumkin - int, double va boshqalar.
Bo'shliq turi bilan nima qilish kerakligi haqida savol tug'ilishi mumkin - bu holda parametr o'rniga chiziqcha ko'rsatilgan:
1
2
3
4
5
6
7
8
9
10
11
|
void main() {
Future future = Future.delayed(Duration(seconds: 3),
() => print("Hello Future")); // возвращаемый тип - void
future.then((_) { // прочерк вместо параметра для типа void
print("Выполнение Future завершено");
}
);
print("Main ends");
}
|
Konsol chiqishi:
Main ends
Hello Future
Выполнение Future завершено
Agar kerak bo'lsa, biz ketma-ket bajariladigan usullarning zanjirlarini yaratishimiz mumkin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void main() {
Future future = Future(() {
print("Выполняется Future");
return "Hello Future"; // возвращаем строку
});
future.then((value){
print("Из Future получено значение: $value");
return 22;
})
.then((value) => print("Выполнение Future завершено. Получено: $value") );
print("Main ends");
}
|
Birinchi usuldan funktsiya Future - satrdan natijani oladi va uni konsolga chop etadi. Bundan tashqari, u yangi natijani qaytaradi - masalan, 22 raqami.
Ikkinchidan keyin usuli funksiyasida biz Future dan boshlang'ich qiymatni emas, aynan shu raqamni olamiz. Bundan tashqari, har bir keyingi keyingi usuldan funktsiya parametri oldingi so'ngra usuldagi funktsiyaning natijasidir.
Konsol chiqishi:
Main ends
Выполняется Future
Из Future получено значение: Hello Future
Выполнение Future завершено. Получено: 22
Qayta ishlashda xatolik
Future ko'rsatadigan operatsiyani bajarishda xatolik yuz berishi mumkin. Bunday holda, tugallangan holatga o'tgandan so'ng, Future ma'lum bir qiymat o'rniga xato haqidagi ma'lumotlarni saqlaydi. Xato haqida ma'lumot olish uchun siz catchError () usulidan foydalanishingiz mumkin, u o'sha paytdagi usulga o'xshash ishlaydi - u xato haqida ma'lumot uzatiladigan qayta qo'ng'iroq qilish funktsiyasini ham qabul qiladi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void main() {
Future future = Future(() {
print("Выполняется Future");
throw "Непредвиденная ошибка";
});
future.then((value){
print("Из Future получено значение: $value");
})
.catchError((err) => print(err) );
print("Ждем получения значения из Future");
}
|
Bunday holda, Future konstruktorida biz otish operatori yordamida xatoni yaratishga taqlid qilamiz ("Kutilmagan xato";). Bu yerda xato obyekti sifatida oddiy satr (“Kutilmagan xato”) ishlatiladi – bu catchError funksiyasiga err parametri orqali uzatiladi.
Natijada, bu holda, keyin usulidan funktsiya ishlamaydi, lekin catchError funksiyasi yonadi, chunki Futureni bajarishda xatolik yuz berdi. Konsol chiqishi:
Ждем получения значения из Future
Выполняется Future
Непредвиденная ошибка
Ikkinchi va ixtiyoriy parametr sifatida catchError usuli xato ob'ektining ma'lum bir shartga mos kelishini tekshiradigan funktsiyani qabul qiladi va agar xato ob'ekti ushbu shartga javob bersa, u holda true, aks holda false qaytariladi. Agar noto'g'ri qaytarilsa, ya'ni xato ob'ekti shartga mos kelmasa, birinchi parametrdagi funktsiya IJRO EMAS.
Keling, bir misolni ko'rib chiqaylik:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void main() {
Future(() {
print("Выполняется Future");
throw 404;
})
.then((value){
print("Из Future получено значение: $value");
})
.catchError((err) {
print("Код ошибки: $err");
},
test: (err) {
return err is int;
});
print("Ждем получения значения из Future");
}
|
throw 404 ifodasi xato ob'ekti int bo'lgan 404 raqamini ifodalashini bildiradi.
catchError usulida ikkinchi parametr funksiya (err) {return err is int; } xato ob'ektini err parametri orqali oladi va xato ob'ekti int turida ekanligini tekshirish uchun err is int ifodasidan foydalanadi. Agar shunday bo'lsa, u holda rost qaytariladi va (err) {print ("Xato kodi: $ err");} funksiyasi bajariladi.
Va bu holda, biz quyidagi konsol chiqishini olamiz:
Ждем получения значения из Future
Выполняется Future
Код ошибки: 404
Ammo, agar biz xato yaratishni quyidagicha yozsak:
Keyin endi raqam emas, satr uzatiladi, mos ravishda return err is int ifodasi bunday xatolik noto'g'ri qaytariladi va unga ishlov berilmaydi.
WhenComplete usuli
Boshqa usul, whenComplete, Kelajak tugagach, ba'zi funksiyalarni bajaradi. Bu funktsiya Future-da xatolik yuzaga keladimi yoki yo'qligidan qat'iy nazar bajariladi - o'sha paytdagi barcha funktsiyalardan keyin va catchError. Masalan:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void main() {
Future(() {
print("Выполняется Future");
return "Hello Dart";
})
.then((value){
print("Из Future получено значение: $value");
})
.catchError((err) {
print("Ошибка: $err");
})
.whenComplete(() { print("Future завершил свою работу"); });
print("Ждем получения значения из Future");
}
|
Konsol chiqishi:
Ждем получения значения из Future
Выполняется Future
Из Future получено значение: Hello Dart
Future завершил свою работу
Do'stlaringiz bilan baham: |