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 завершил свою работу