问题描述
我是Dart的新手。我从一些文章和文档(例如this article)中了解到:
-
async/await
使用与Future
相同的机制,即FIFOEvent Loop
。 -
Event Loop
在执行main()
之后启动。 -
async
函数同步运行 直到第一个await
关键字。然后他们暂停执行,然后执行返回到调用堆栈中的上一个函数。 - 剩余的代码包装到
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
无关的差异机制。也许我几乎误会了一些东西。
解决方法
我认为我了解的东西:
-
Future
可以表示Event queue
中的事件,也可以表示Microtask queue
中的 tasks 。
(例如:默认的Future()
构造函数将 event 放入Event queue
,Future.microtask()
将 task 放入Microtask queue
) -
await
创建Future.than
回调以获取Future
。
我的主题示例说明:
- 前三个
Futrue
将事件放入Event queue
。
在 -
await (() async => print("asyncFunc middle"))()
在Microtask queue
中创建“空” 任务(我假定所有隐式Future
被安排到Microtask queue
)。比await
将其余指令(print("end [from main]")
)作为Future.than
回调将此“空” 任务的 放置。
- 涉及
Event Loop
时,它首先从Microtask queue
执行“空” 任务。结束于回调:print("end [from main]")
。 - 然后
Event loop
执行Event queue
,第二个 event 在Microtask queue
中产生类似的“空” 任务。这就是end [from 2]
发生在第三Future
之前的原因
Future<void>
中隐式创建 的