Sobes.tech
Middle

Какви са вашите знания за асинхронността в 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) и продължава изпълнението на следващия код. Когато асинхронната операция приключи, нейният резултат се връща обратно в "опашката с събития". Цикълът на събитията постоянно проверява "опашката с събития" и изпълнява задачите, когато основният поток е свободен.