Назад к вопросам
Middle
157
questionbank

Каковы ваши знания об асинхронности в Dart?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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