为何Dart中Future会在main函数执行完毕后仍运行?
为什么Dart的Future能在main函数结束后继续运行?
这个问题问得很关键!其实核心原因在于Dart的**事件循环(Event Loop)**机制,咱们结合你的示例一步步拆解:
首先先看你的示例代码:
Future<void> fetchUserOrder() { // Imagine that this function is fetching user info from another service or database. return Future.delayed(Duration(seconds: 2), () => print('Large Latte')); } void main() { fetchUserOrder(); print('Fetching user order...'); }
执行流程的细节:
- 同步代码优先执行:main函数是程序的入口,里面的代码会同步执行。当你调用
fetchUserOrder()时,Future.delayed并不会立刻执行回调函数,而是会把这个延迟2秒的异步任务,放到Dart的**事件队列(Event Queue)**中,然后立刻返回,继续执行main里的下一行代码——也就是print('Fetching user order...')。 - main结束≠程序终止:当main函数的最后一行代码执行完,Dart程序并不会直接退出!它会转而启动事件循环,开始处理队列里的异步任务。
- 事件循环处理异步任务:事件循环会先处理**微任务队列(Microtask Queue)**里的所有任务(比如
scheduleMicrotask创建的任务),之后再处理事件队列里的任务。你的Future.delayed属于事件队列任务,等2秒的延迟时间到了,事件循环就会取出这个任务,执行里面的print('Large Latte')。 - 程序真正退出的时机:只有当微任务队列和事件队列都完全清空,没有任何待处理的异步任务时,Dart程序才会终止运行。
所以你看到的输出是先打印同步的Fetching user order...,2秒后再打印异步任务的Large Latte,这完全符合Dart的执行规则~
内容的提问来源于stack exchange,提问作者Good
相关产品推荐
相关产品推荐

