ni qaytarish usuli ob'ekt darhol to'g'ri natija qiymatiga ega bo'lmaydi, buning o'rniga, keyinroq vaqt oralig'ida biroz hisoblashdan keyin.
O'ylab ko'ring the quyidagi kod, qayerda biz bor the asosiy funktsiyasi bu qo'ng'iroqlar a uzoq muddatli operatsiya:
Import 'dart:io';
bekor longRunningOperation() { uchun (int i = 0; i < 5; i++) {
uyqu (davomiylik (sekundlar: 1)); chop etish ("indeks: $i");
}
}
asosiy() {
chop etish ("boshlash ning uzoq yugurish operatsiya"); longRunningOperation();
chop etish ("davomi asosiy tanasi");
uchun (int i = 10; i < 15; i++) { uyqu (davomiylik (sekundlar: 1)); chop etish ("indeks dan asosiy: $i");
}
chop etish ("end ning asosiy");
}
Agar siz oldingi kodni bajarsangiz, u asosiy kodni to'xtatganini sezasiz funktsiyani bajarish paytida the longRunningOperation() funktsiyasi hisoblanadi yugurish. Bu hisoblanadi a sinxron barcha kodlarning bajarilishi va u barcha foydalanish holatlarida yaxshi mos kelmasligi mumkin.
Endi, qilaylik demoq bu the longRunningOperation() funktsiyasi hisoblanadi a asinxron funktsiya va asosiy() Davom etish tugashini kutmasdan bajarishni davom ettirishi mumkin:
Import 'dart: async';
Kelajak longRunningOperation() asinx { uchun (int i = 0; i < 5; i++) {
kuting Future.delayed(Davomiylik(sekundlar: 1)); chop etish ("indeks: $i");
}
}
asosiy() { ... } // asosiy funktsiyasi hisoblanadi the bir xil
Biz bor qilingan biroz o'zgarishlar uchun namoyish qilish Qanday Kelajak ishlaydi to'g'ri:
longRunningOperation () funksiya endi asinxronga ega ko'rsatish uchun o'zgartiruvchi bu bu bo'ladi qaytish a Kelajak funktsiyasi va the Kelajak funktsiyasi bo'ladi funktsiyani bajarish oxirida yakunlanadi. Qaytish turi ham Future ekanligini unutmang .
Biz uyquni almashtirdik() Kelajak bilan qo'ng'iroq qilish.kechiktirilgan qo'ng'iroq qiling. Bu ko'rsatish uchun the foydalanish ning the kuting kalit so'z. The kuting kalit so'z ishlaydi
asinx bilan funktsiyalari. Kelajakni chaqirganda funktsiyasi, bizga natijasi kerak bo'lishi mumkin the Kelajak funktsiyasi uchun davom eting ijro. In bu hol, biz istayman uchun davom eting faqat belgilangan kechikishdan keyin chop etish uchun.
Agar siz bajarmoq the Oldingi kod, siz mumkin xabarnoma nimadur g'alati; the chiqish hisoblanadi quyidagicha :
boshlash ning uzoq yugurish operatsiya davom etmoqda asosiy tanasi
indeks dan asosiy: 10 indeks dan asosiy: 11 indeks dan asosiy: 12 indeks dan asosiy: 13 indeks dan asosiy: 14 oxiri ning asosiy
indeks: 0
indeks: 1
indeks: 2
indeks: 3
indeks: 4
Bu emas a bir vaqtda kod qayerda bitta kod amalga oshiradi keyin boshqa kabi oldin; Bu yerga, tartibi qanday o'zgarishlar. Oldingi misolda o'zgarish qachon sodir bo'ladi
the longRunningOperation() funktsiyasi qo'ng'iroqlar kuting ichida boshqa asinx funktsiyasi. Bu yerda, funktsiya to'xtatilgan va bo'ladi faqat kechikishdan keyin davom ettiriladi 1 ikkinchi. dan keyin kechikish, ammo, asosiy funktsiya allaqachon qayta ishlayapti, chunki u endi kutmaydi uzoq operatsiya uchun uchun to'liq, shunday the longRunningOperation() kod bo'ladi bo'l bajarilgan faqat asosiydan keyin funksiya tugadi.
Bir narsa biz mumkin qil hisoblanadi uchun qilish the asosiy() funktsiyasi ichiga a asinx funktsiyasi va kuting longRunningOperation() ning bajarilishi . Shu tarzda, asosiy() await ga qo'ng'iroq qilganimizda funksiya to'xtatiladi longRunningOperation() va faqat amalga oshirilgandan keyin qayta tiklanadi. Bu odatdagi sinxron kod kabi ishlaydi, quyidagicha:
asosiy() asinx {
chop etish ("boshlash ning uzoq yugurish operatsiya");