Асинхронность / ожидание Dart во Flutter

Подходы async и await в Dart очень похожи на другие языки (глядя на вас C #), что делает эту тему удобной для понимания тех, кто использовал этот шаблон раньше. Однако, даже если у вас нет опыта асинхронного программирования с использованием async / await , вам будет легко следовать здесь. Помните, что эта статья предполагает хотя бы базовое знакомство с асинхронным программированием.

Короче говоря, вам нужно понять два ключевых слова — async и ждать . Любые функции, которые вы хотите запускать асинхронно, должны иметь модификатор async . Этот модификатор идет сразу после сигнатуры функции, например:

  void hello () async {print ('здесь произойдет что-то интересное ...');}  

Это, конечно, надуманный пример. Как правило, функция, которую вы хотите запустить асинхронно, будет иметь в себе некоторые дорогостоящие операции, такие как файловый ввод-вывод (вызов API к службе RESTful) или какие-то более распространенные вычисления. Не волнуйтесь, мы немного рассмотрим более сложные сценарии…

Сначала мы переходим к await . Часть await в основном говорит: продолжайте и запускайте эту функцию асинхронно, а когда это будет сделано, переходите к следующей строке кода . Это лучшая часть использования async / await , вы можете написать код, которому очень легко следовать, например:

  void main () async {ожидание hello ();  print ('все готово');}  

Есть две важные вещи, которые нужно понять относительно блока кода выше. Во-первых, мы используем модификатор async в основном методе, потому что мы собираемся запускать функцию hello () асинхронно.

Во-вторых, мы помещаем модификатор await непосредственно перед нашей асинхронной функцией. Следовательно, это часто называют шаблоном async / await .

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

Как это работает под капотом?

Итак, как именно Дарт заставляет все это работать? Чтобы по-настоящему понять это, вам нужно понять фьючерсы на Dart . Вы можете пропустить этот раздел, если хотите, и по-прежнему использовать шаблон, описанный выше, но полезно знать, как и почему он работает.. Итак, вот тонкости того, как async и await работают в Dart.

Когда вы await асинхронная функция, выполнение кода в вызывающей стороне приостанавливается, пока выполняется операция async . Когда операция завершена, значение того, что ожидалось, содержится в Future объект.

Взгляните на простую программу ниже. Мы присваиваем результат асинхронной функции four () переменной x . Затем мы распечатываем его номер, чтобы доказать, что получили ожидаемый результат.

 import 'dart: async'; void main () async {var x = await four ();  print (x);} Будущее  four () async {return 4;} 

Более реалистичный пример

Пока что я показал вам надуманные примеры, которые никогда не должны были быть асинхронными. Это было сделано для того, чтобы все было как можно проще. Теперь давайте проделаем реалистичную работу async / await .

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

 import 'dart: async'; class Employee {int id;  String firstName;  String lastName;  Сотрудник (this.id, this.firstName, this.lastName);} void main () async {print ("получение сотрудника ...");  var x = ожидание getEmployee (33);  print ("Получил $ {x.firstName} $ {x.lastName} с идентификатором # $ {x.id}");} Future  getEmployee (int id) async {//Имитация реальной задержки вызова службы  может выглядеть как задержка на 2 секунды await Future  .delayed (const Duration (seconds: 2)); //а затем возвращаем сотрудника - давайте представим, что мы взяли это из базы данных 🙂 var e = new Employee (id, "Joe", "Coder");  return e;} 

Если вы запустите приведенный выше код, вы сразу увидите распечатанное сообщение «получение сотрудника…» . Затем, через две секунды, сотрудник возвращается, и данные об этом сотруднике распечатываются..

Несколько асинхронных вызовов

В некоторых языках необходимость выполнения нескольких асинхронных вызовов может стать настоящей головной болью, если они не поддерживают async / ожидание шаблон. Это потому, что, как правило, вы делаете первый асинхронный вызов и в его обратный вызов вкладываете еще один асинхронный вызов и так далее … Это называется «ад обратного вызова ». Однако с помощью async / await вы выполняете вызовы линейно и без вложенности — как и в любом неасинхронном коде.

Рассмотрим пример ниже, у нас есть три асинхронных метода, и мы хотим асинхронно вызывать их, по одному, по порядку.

 import 'dart: async'; Future  firstAsync () async {await Future   .delayed (const Duration (секунды: 2));  return "First!";} Future  secondAsync () async {await Future  .delayed (const Duration (секунды: 2));  return "Second!";} Future  thirdAsync () async {await Future  .delayed (const Duration (секунды: 2));  return "Третий!";} void main () async {var f = await firstAsync ();  печать (е);  var s = ждать secondAsync ();  печать (и);  var t = ждать thirdAsync ();  печать (т);  print ('done');} 

Если бы вы запустили указанную выше программу, вы бы увидели следующий результат в консоли (обратите внимание на двухсекундную задержку между каждым вызовом):

First!

Second!

Третий!

готово

Оцените статью
nanomode.ru
Добавить комментарий