有以下代码:
案例1.基本示例
Future<void> main() async {
print('A');
await Future(
() {
print('C');
Future(() => print('D'));
Future(() => print('E')).then((value) => print('F'));
Future.microtask(() => print('W'));
Future.microtask(() => print('Z'));
print('G');
},
);
print('B');
}
输出:A C G B W Z D E F
案例2
Future<void> main() async {
print('A');
await Future(
() async {
print('C');
Future(() => print('D'));
await Future(() => print('E')).then((value) => print('F'));
Future.microtask(() => print('W'));
Future.microtask(() => print('Z'));
print('G');
},
);
print('B');
}
输出:A C D E F G B W Z
字母“DEF”已从末尾移至中间。发生这种情况是因为await关键字自动将我们重定向到事件循环的新迭代,其中Future已经调度(第7行),并且我们还将控制权转移到Future中的函数范围(第8行),因此代码在函数返回结果之前,下面的代码不会被执行。
执行后,代码将像基本示例一样继续运行。
案例3
Future<void> main() async {
print('A');
await Future(
() async {
print('C');
Future(() => print('D'));
Future(() => print('E')).then((value) => print('F'));
Future.microtask(() => print('W'));
await Future.microtask(() => print('Z'));
print('G');
},
);
print('B');
}
输出:A C W Z G B D E F
案例4
Future<void> main() async {
print('A');
await Future(
() async {
print('C');
Future(() => print('D'));
Future(() => print('E')).then((value) => print('F'));
Future.microtask(() => print('W'));
Future.microtask(() => print('Z'));
print('G');
},
);
print('B');
}
输出:A C G W Z B D E F
微任务显示在输出“B”之前。
这个案例没看懂。
由于
await
只是调用 Future.then
的语法简写,因此您可以将 Case 4 替换为以下内容:
void main() async {
print('A');
Future(
() async {
print('C');
Future(() => print('D'));
Future(() => print('E')).then((value) => print('F'));
Future.microtask(() => print('W'));
Future.microtask(() => print('Z'));
print('G');
},
).then((_) => print('B'));
}
并且根据docs,如果 future 已经完成,回调将不会立即调用,而是会安排在稍后的微任务中。 因此
print('B')
将作为微任务添加到已包含 print('W')
和 print('Z')
微任务的微任务队列中。
我的答案基于以下讨论,阅读起来非常有用。
我真的很喜欢你对案例 1-3 的解释。我可以肯定地告诉你,事件循环行为最让我惊讶。
不幸的是,我从未听说过看到
await
事件循环被重定向到新的迭代,您能否提供我可以在哪里进一步了解它?
另外,我对第三个案例和案例中的第三点很感兴趣。
The event loop does not have time to reach the event queue at the iteration
。这是对所发生情况的有趣解释,但我找不到有关流程的更多信息。是否有可能应用文档链接或其他内容来更深入地调查此类行为?
先谢谢你了。再说一遍,这是一张很棒的票