Dart:无法理解异步/唤醒,未来和事件循环如何协同工作

问题描述

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

  1. async/await使用与Future相同的机制,即FIFO Event Loop
  2. Event Loop在执行main()之后启动。
  3. async函数同步运行 直到第一个await关键字。然后他们暂停执行,然后执行返回到调用堆栈中的上一个函数。
  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]

但实际上它返回:

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无关的差异机制。也许我几乎误会了一些东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)