Dart dasturlash tilida asinxron kod yozish uchun asosiy sinf Future sinfidir. Endi u qanday imkoniyatlarni taqdim etishi bilan tanishib chiqaylik.
Future obyekti aniqlanganda, u tugallanmagan holatda bo'ladi va biroz keyinroq bajariladi. Ammo operatsiya allaqachon amalga oshirilgan va tugallangan holatga kirgan paytni qanday tutishimiz mumkin? Buning uchun Future da then usuli mavjud. Bu usul operatsiya tugashi bilan ishga tushadigan qayta qo'ng'iroq funksiyasini qabul qiladi. Funksiya o'zining yagona parametri sifatida Future dan olingan qiymatni oladi.
Quyidagi misolni ko'rib chiqing:
void main() {
Future<String> future = Future.delayed(
Duration(seconds: 1),
() {
print("Future ni bajaring");
return "Salom Uzbekdevs";
});
future.then((value){
print("Future dan olingan qiymat: $value");
});
print("Asosiy funksiyani bajarish");
}
Bu yerda Future bilan ishlash ikki bosqichda sodir bo'ladi. Birinchidan, konstruktor yordamida Future.delayed bajariladigan vazifani aniqlaymiz:
Future<String> future = Future.delayed(
Duration(seconds: 1),
() {
print("Future ni bajaring");
return "Salom Uzbekdevs";
});
Bu vazifa ekranga satrni chop etadi va satrni qaytaradi, shuning uchun Future obyekti Future<String> turiga ega. Bundan tashqari, bu 1 soniya kechikish bilan sodir bo'ladi.
Ikkinchi bosqichda biz then() metodini chaqiramiz:
future.then((value){
print("Future dan olingan qiymat: $value");
});
Qayta qo'ng'iroq qilish funksiyasi qiymat parametrini qabul qiladigan metod then() ga o'tkaziladi - bu vazifa bajarilganda qaytariladigan qiymat bo'ladi. Keyin funksiyaning o'zi ushbu natijaviy qiymatni konsolga chop etadi. Natijada, biz quyidagi natija chiqishini ko’ramiz:
Xuddi shunday, biz boshqa turdagi qiymatlarni ham olishimiz mumkin - int, double va boshqalar.
void turi bilan nima qilish kerakligi haqida savol tug'ilishi mumkin - bu holda parametr o'rniga siz tag chiziqchani belgilashingiz mumkin then() metodiga:
void main() {
Future<void> future = Future.delayed(
Duration(seconds: 1),
() => print("Salom Uzbekdevs"));
future.then((_){
print("Future bajarish yakunlandi");
});
print("Asosiy funksiyani bajarish");
}
Bilamizki, void turida hech qanday qiymat qaytmaydi.
Agar kerak bo'lsa, biz ketma-ket bajariladigan then metodining zanjirlarini yaratishimiz mumkin:
void main() {
Future<String> future = Future.delayed(
Duration(seconds: 1),
() => "Salom Uzbekdevs");
future.then((value){
print("Future dan olingan qiymat: $value");
return 2022;
})
.then((value) => print("Future yakunlandi. Uzbekdevs sayti $value-yilda ishga tushgan"));
print("Asosiy funksiyani bajarish");
}
Birinchi usulda funksiya Future - satridan natijani oladi va uni ekranga chiqaradi. Bundan tashqari, u yangi natijani qaytaradi – bu 2022. So'ngra ikkinchi usuldan funksiyada Future dan boshlang'ich qiymatni emas, aynan 2022 raqamini olamiz. Bundan tashqari, har bir keyingi usuldagi funksiya parametri oldingi usuldagi funksiyaning qaytargan natijasini oladi.
Qayta ishlashda xatolik
Future taqdim etgan operatsiya xatolikka duch kelishi mumkin. Bunday holda, tugallangan holatga o'tishda, Future ma'lum bir qiymat o'rniga xato ma'lumotlarni saqlaydi. Xato haqida ma'lumot olish uchun catchError() usulidan foydalanishimiz mumkin, bu then usuliga o'xshash ishlaydi. U xato ma'lumotlari uzatiladigan qayta qo'ng'iroq qilish funksiyasini ham qabul qiladi:
void main() {
Future<String> future = Future.delayed(
Duration(seconds: 1),
() {
print("Future ishladi");
throw "Kutilmagan xato";
});
future.then((value){
print("Futuredan olingan qiymat: $value");
})
.catchError((err) => print(err));
print("Future dagi qiymatni olish kutilmoqda");
}
Bu holda Future konstruktorida throw operatori yordamida xato yuzaga keltiramiz. Bu yerda ishlatiladigan xato obyekti oddiy satrdir. "Kutilmagan xato" - bu catchError() funksiyasiga err parametri orqali uzatiladi.
Natijada, bu holda, then usulidagi funksiya ishlamaydi, lekin catchError funksiyasi ishlaydi, chunki Future dasturini bajarishda xatolik yuz berdi. Ekranga esa ushbu natija chiqadi: