Основы Dart 2.x (асинхронное программирование)

15.09.2019
This article was written for an older Flutter version and is being updated. Some code may not compile on the current version.

Введение:

Традиционно в программировании используют синхронное программирование — последовательное выполнение инструкций с синхронными системными вызовами, которые полностью блокируют поток выполнения, пока системная операция, например чтение с диска или получение данных из сервера не завершится, до этого вы не будите иметь возможность работать с программой.

  • Асинхронность (asynchrony) подразумевает, что операция может быть выполнена кем-то на стороне: удаленным веб-узлом, сервером или другим устройством за пределами текущего вычислительного устройства при этом не блокируя главный поток выполнения программы.
  • Асинхронность в программировании — выполнение процесса в неблокирующем режиме системного вызова, что позволяет потоку программы продолжить обработку. Проще говоря, главный "процесс" ставит задачу и передает ее другому независимому "процессу", при этом сам продолжает работать.

Например: Вы решили купить новый аккумулятор на свою "Приору", на сайте или в мобильном приложении в фильтре товаров, выбираете аккумулятор по необходимым вам критериям (Производитель, Ёмкость, Сила тока холодной прокрутки) и после нажатия кнопки "найти товар по заданным критериям" выполняется асинхронная операция поиска на сервере необходимого вам товара, во время этого поиска, вы можете скролить сайт, написать в чат менеджеру магазина, вообщем выполнять ещё какие либо действия пока происходит поиск товара. Если бы операция выполнялась синхронно, вы бы не смогли взаимодействовать с приложением пока не завершится поиск и вывод на страницу товара.

pic
pic

Асинхронное программирование в Dart:

DOC:dart.dev Код в Dart работает в одном треде (потоке) выполнения. Если код занят долгими вычислениями или ожидает операцию ввода/вывода, то вся программа приостанавливается. Dart использует futures для представления результатов асинхронных операций. Для работы с futures можно использовать async и await или Future API .

-

future - объект класса Future<Т>, который представляет собой асинхронную операцию, возвращающую результат типа T . Если результат операции не используются, то тип future указывают Future<void>. При вызове функции, возвращающей future, происходит две вещи:

-

  1. Функция встает в очередь на выполнение и возвращает незавершенный объект Future.

-

  1. Когда операция завершена, future завершается со значением или ошибкой.

Для написания кода, зависящего от future, у вас есть два варианта:

  • a) Использовать async — await
  • b) Использовать Future API

async — await

-

Ключевые слова async и await являются частью поддержки асинхронности в Dart. Они позволяют писать асинхронный код, который выглядит как синхронный код и не использует Future API.

-

Асинхронная функция — это функция, перед телом которой находится ключевое слово async . Ключевое слово await работает только в асинхронных функциях.

Лекция:async\await Подробный пример

Future API

  • Если писать асинхронный код с помощью Future API , используется метод then() для регистрации обратного вызова. Этот обратный вызов сработает, когда future завершится.
import 'dart:io';
import 'dart:async';

void printDailyNewsDigest() {
  File file = new File("dailyNewsDigest.txt");
  Future future = file.readAsString();
  future.then((content) {
    print(content);
  });
}

Метод printDailyNewsDigest() использует readAsString() , который не будет блокировать выполнение программы. Вызов readAsString() будет стоять в очереди на выполнение и не будет останавливать работу остальной части кода. Программа печатает номера лотереи, прогноз погоды и футбольный счет. Когда readAsString() заканчивает чтение файла новостей, программа печатает его содержимое. Если readAsString() занимает некоторое время, чтобы завершить свою работу, никой проблемы в этом не будет: пользователь может прочитать другие материалы до того, как будет напечатан ежедневный дайджест новостей.