如何在 Dart 中实现 async/await

How to implement async/await in Dart

我想我理解 async 背后的想法,返回一个 Future,但我不清楚 async 在一个非常基本水平。据我了解,它不会自动在程序中创建异步行为。例如:

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 完全取消 async 功能?

现在,我认为 main() async 本身并没有真正激活异步行为。如果在 main() 之后添加 async,则不会发生任何变化。但是,它允许您使用 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 {} 以及在脚本 html 标记之后使用它,但是没有 在任何地方等待。它在不同的上下文中意味着不同的东西吗?我希望我已经充分解释了逻辑。您能解释一下我对 async/await 的用法有何误解吗?谢谢。

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