Основы Dart 2.x (асинхронное программирование)
15.09.2019Введение:
Традиционно в программировании используют синхронное программирование — последовательное выполнение инструкций с синхронными системными вызовами, которые полностью блокируют поток выполнения, пока системная операция, например чтение с диска или получение данных из сервера не завершится, до этого вы не будите иметь возможность работать с программой.
- Асинхронность (asynchrony) подразумевает, что операция может быть выполнена кем-то на стороне: удаленным веб-узлом, сервером или другим устройством за пределами текущего вычислительного устройства при этом не блокируя главный поток выполнения программы.
- Асинхронность в программировании — выполнение процесса в неблокирующем режиме системного вызова, что позволяет потоку программы продолжить обработку. Проще говоря, главный "процесс" ставит задачу и передает ее другому независимому "процессу", при этом сам продолжает работать.
Например: Вы решили купить новый аккумулятор на свою "Приору", на сайте или в мобильном приложении в фильтре товаров, выбираете аккумулятор по необходимым вам критериям (Производитель, Ёмкость, Сила тока холодной прокрутки) и после нажатия кнопки "найти товар по заданным критериям" выполняется асинхронная операция поиска на сервере необходимого вам товара, во время этого поиска, вы можете скролить сайт, написать в чат менеджеру магазина, вообщем выполнять ещё какие либо действия пока происходит поиск товара. Если бы операция выполнялась синхронно, вы бы не смогли взаимодействовать с приложением пока не завершится поиск и вывод на страницу товара.
Асинхронное программирование в Dart:
DOC:dart.dev Код в Dart работает в одном треде (потоке) выполнения. Если код занят долгими вычислениями или ожидает операцию ввода/вывода, то вся программа приостанавливается. Dart использует futures для представления результатов асинхронных операций. Для работы с futures можно использовать async и await или Future API .
-
future - объект класса Future<Т>, который представляет собой асинхронную операцию, возвращающую результат типа T . Если результат операции не используются, то тип future указывают Future<void>. При вызове функции, возвращающей future, происходит две вещи:
-
- Функция встает в очередь на выполнение и возвращает незавершенный объект Future.
-
- Когда операция завершена, 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() занимает некоторое время, чтобы завершить свою работу, никой проблемы в этом не будет: пользователь может прочитать другие материалы до того, как будет напечатан ежедневный дайджест новостей.