Какви са вашите знания за асинхронността в Dart?
sobes.tech AI
Отговор от AI
Асинхронността в Dart се реализира чрез:
-
Концепцията за "изоляти" (Isolates): Независими работни процеси, всеки със собствената си памет. Използват се за паралелно изпълнение на ресурсоемки задачи без блокиране на основния поток на потребителския интерфейс. Общуването между изолатите става чрез портове (ReceivePort, SendPort).
-
Ключови думи
async,await:asyncмаркира функция, която ще изпълнява асинхронни операции и ще връщаFuture.awaitсе използва вътре вasyncфункция за изчакване на завършването на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) и продължава изпълнението на следващия код. Когато асинхронната операция приключи, нейният резултат се връща обратно в "опашката с събития". Цикълът на събитията постоянно проверява "опашката с събития" и изпълнява задачите, когато основният поток е свободен.