როგორ იცით Dart-ში ასინქრონულობის შესახებ?
sobes.tech AI
პასუხი AI-სგან
Dart-да асинхронлылык түбөлүк цикл моделине негизделген:
-
"Изоляттар" (Isolates) концепциясы: Мезгилсиз иштөөчү процесстер, ар бири өзүнүн эс тутуму менен. Бул ресурсту талап кылган тапшырмаларды негизги колдонуучу интерфейсинин агымын бөгөттөбөстөн аткаруу үчүн колдонулат. Изоляттардын ортосундагы байланыш порттор (ReceivePort, SendPort) аркылуу жүргүзүлөт.
-
async,awaitачкыч сөздөрү:asyncфункциясы асинхрондук операцияларды аткарып,Futureкайтарат.awaitasyncфункциясынын ичинде колдонулуп,Futureбүтүшүн күтөт.awaitке жеткенде, функциянын аткарылышы токтоп, башка операциялар аткарылууга мүмкүнчүлүк алат, ал эмиFutureжыйынтыгы же катасы менен аяктайт.
Future<String> fetchData() async { // Күтүү моделинде жайгаштыруу await Future.delayed(Duration(seconds: 2)); return 'Маалымат алынды'; } void main() async { print('Баштоо'); String result = await fetchData(); // fetchData бүтүшүн күтүп жатабыз print(result); print('Аякталуу'); } -
Future<T>классы: Асинхрондук операциянын жыйынтыгын көрсөтөт, ал келечекте жеткиликтүү болот.Futureүч абалда болушу мүмкүн:- Аягына чыга элек (uncompleted)
- Жыйынтык менен аяктады (completed with a value)
- Катасы менен аяктады (completed with an error)
Futureбүтүшүн иштетүүthen(),catchError(),whenComplete()жеawaitаркылуу жүргүзүлөт. -
Stream<T>классы: Асинхрондук окуялардын тизмеси. Бул маалымат агымдарын иштетүү үчүн колдонулат, мисалы, файлдан окуу, тармак аркылуу маалымат алуу, колдонуучу интерфейсинин окуялары. Агым бир жолу (single-subscription) же көп жолу (broadcast) болушу мүмкүн. Окуяларды иштетүүlisten(),async*,yieldаркылуу жүргүзүлөт.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Агымга маанини жиберүү } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Алып келинди: $data'), onError: (error) => print('Ката: $error'), onDone: () => print('Агым аяктады'), ); }
Асинхрондуулук Dart-да "бир гана окуялык цикл" (event loop) моделине негизделген. Негизги агым коды сапаттуу аткарат, бирок асинхрондук операцияга туш келгенде (мисалы, await же Future.then), ал "окуялар кезеги" (event queue) өткөрүлүп, кийинки коддун аткарылышын улантат. Асинхрондук операция аяктагандан кийин, анын жыйынтыгы кайра "окуялар кезегине" кайтарылат. Окуялар цикли үзгүлтүксүз "окуялар кезегин" текшерип, негизги агымды бошотуу үчүн тапшырмаларды аткарат.