Dart:无法理解 async/awaut、Future 和 Event 循环如何协同工作

Dart: Can't understand how async/awaut, Future and Event loop work together

我是 Dart 新手。正如我从一些文章和文档中了解到的(例如 this article):

  1. async/await使用与Future相同的机制,即先进先出Event Loop
  2. Event Loopmain() 执行后启动。
  3. async 函数运行 同步 直到第一个 await 关键字。然后他们暂停执行,并执行returns到调用堆栈中的上一个函数。
  4. 剩下的代码被包装到 Future 并排队到 Event Loop(对我来说最不确定的一点)。

基于我期望的这些点,以下代码:

main() {
  Future(() => print("1"));
  Future(() {
    print("2");
    asyncFunc("2");
  });
  Future(() => print("3"));

  print("main");
  asyncFunc("main");
  print("\nEvent loop starts?\n");
}

asyncFunc(String from) async {
  print("start  [from $from]");
  await (() async => print("middle [from $from]"))();
  print("end    [from $from]");
}

将在 main() 执行后创建类似于此事件队列的内容:
future1 -> future2 -> future3 -> end_from_main
而在future2执行后,事件end_from_future2会排到最后:
future1 -> future2 -> future3 -> end_from_main -> end_from_future2

所以我期望的结果输出应该是:

main
start  [from main]
middle [from main]

Event loop starts?

1
2
start  [from 2]
middle [from 2]
3
end    [from main]
end    [from 2]

但实际上它returns:

main
start  [from main]
middle [from main]

Event loop starts?

end    [from main]
1
2
start  [from 2]
middle [from 2]
end    [from 2]
3

所以我得出的结论是:async/await 个事件优先于 Fututre 个事件。他们要么使用不同的机制,与 EventLoop 无关。或者也许我几乎没有误解什么..

我认为我理解的是:

  • Future 可以代表 Event queue 中的 events,或者 Microtask queue 中的 tasks
    (例如:默认 Future() 构造函数将 event 放入 Event queueFuture.microtask()task 放入 Microtask queue)
  • await 创建 Future.than 回调以接收 Future

我的题目示例解释:

  • 前三个 Futrue 事件 放入 Event queue
  • Future<void>await (() async => print("asyncFunc middle"))() 中创建 隐式 Microtask queue 中创建“空”任务 (我假设所有 implicit Future 都被安排到 Microtask queue)。比 await 将剩余指令 (print("end [from main]")) 作为 Future.than 回调到此“空”任务.
  • 当涉及到 Event Loop 时,它首先执行来自 Microtask queue 的“空”任务。以回调结束:print("end [from main]").
  • 并且比 Event loop 执行 Event queue,其中第二个 事件 Microtask queue。这就是为什么 end [from 2] 发生在第三个 Future
  • 之前