Как реализовать async/await в Dart

Я думаю, что понимаю идею асинхронности, возвращающей будущее, но мне не ясно, как асинхронность ведет себя на самом базовом уровне. Насколько я понимаю, он не создает автоматически асинхронное поведение в программе. Например:

import 'dart:async';
main() {
  a();
  b();
}
a()  {
  new Timer(new Duration(milliseconds: 20), () {});  // create latency
  print("a");
}
b()  {
  print("b");
}
// a
// b

Если вы ставите async после a(), b() сначала выполняется асинхронно, а a () выполняется после заданной задержки:

import 'dart:async';
main() {
  a();
  b();
}
a() **async** {
  new Timer(new Duration(milliseconds: 20), () {});  // create latency
  print("a");
}
b()  {
  print("b");
}
// b 
// a

Но если вы ставите async после a () и b(), сначала выполняется a(), подобно тому, как вообще не используется async:

import 'dart:async';
main() {
a();
b();
}
a() **async** {
  new Timer(new Duration(milliseconds: 20), () {});  // create latency
  print("a");
}
b() **async** {
  print("b");
}
//a
//b

Использует ли async для всех функций полную отмену асинхронной функции?

Теперь я думаю, что main () async фактически не активирует асинхронное поведение само по себе. Если вы добавите async после main(), ничего не изменится. Тем не менее, он позволяет вам использовать await, в случае, если вы должны дождаться завершения функции a(), прежде чем продолжить программу. Это правильно?

import 'dart:async';
main() **async** {
  **await** a();
  b();
}
a() **async** {
new Timer(new Duration(milliseconds: 20), () {});  // create latency
print("a");
}
b() {
print("b");
}
// waits for the value of a() if you put **await** keyword
// a
// b

Тем не менее, я вижу main () async {} alot, а также использую его после html-тега script, но нигде не ожидается. Означает ли это разные вещи в разных контекстах? Я надеюсь, что объяснил логику адекватно. Можете ли вы объяснить, как я неправильно понимаю использование async/await? Спасибо.

1 ответ

Решение
a()  {
  new Timer(new Duration(milliseconds: 20), () {});  // create latency
  print("a");
}

Этот код не задерживает выполнение print("a"); в течение 20 мс Это просто задерживает выполнение {} который поставлен в очередь для последующего исполнения, а затем сразу же продолжил с print("a");

Ваш код использует async / await и эквивалентный код без async / await будет выглядеть так:

import 'dart:async';
main() async {
  await a();
  b();

  await main2(); // call the example without async/await
}
Future a()  async {
  await new Future.delayed(const Duration(milliseconds: 20), () {});  // create latency
  print("a");
}
void b()  {
  print("b");
}

Future main2() {
  return a2().then((_) {
    b();
  }); 
}

// equivalent of a without async/await
Future a2()   {
  return new Future.delayed(const Duration(milliseconds: 20), () {})  // create latency
  .then((_) => print("a"));
}

Попробуйте на DartPad

Другие вопросы по тегам