经过一番调查,似乎正确的答案是“它们将在下一个事件循环中执行”
要对其进行测试,您可以编写如下内容:
import "dart:async";
void main() {
new Future(() {
scheduleMicrotask(()=>print("before loop 1"));
print("in event loop");
}).then((_) {
scheduleMicrotask(()=>print("before loop 2"));
print("in event loop");
}).then((_) {
scheduleMicrotask(()=>print("before loop 3"));
print("in event loop");
});
}
它应该输出:
在事件循环
中 在事件循环
中 在事件循环中
在循环 1
之前 在循环 2
之前 在循环 3 之前
虽然我不确定你不能打破这个优化。所以唯一确定的事实是第一个Future
将首先完成,第二个 - 第二个。
编辑:奇怪的部分(过时):
使用这样的代码:
import "dart:async";
void main() {
new Future(() {
scheduleMicrotask(print("before loop 1"));
print("in event loop");
}).then((_) {
scheduleMicrotask(print("before loop 2"));
print("in event loop");
}).then((_) {
scheduleMicrotask(print("before loop 3"));
print("in event loop");
});
}
输出是:
before loop 1
in event loop
before loop 2
in event loop
before loop 3
in event loop
Unhandled exception:
The null object does not have a method 'call'.
NoSuchMethodError: method not found: 'call'
Receiver: null
...
但是有了这个:
import "dart:async";
void main() {
new Future(() {
scheduleMicrotask(()=>print("before loop 1"));
print("in event loop");
}).then((_) {
scheduleMicrotask(()=>print("before loop 2"));
print("in event loop");
}).then((_) {
scheduleMicrotask(()=>print("before loop 3"));
print("in event loop");
});
}
输出是:
在事件循环
中 在事件循环
中 在事件循环中
在循环 1
之前 在循环 2
之前 在循环 3 之前
编辑2:
我想我明白了。在第一个(错误的版本)中scheduleMicrotask
,实际上从未正确安排过,但由于 Dart 有急切的参数执行,它print()
无论如何都会执行。所以发生的事情是所有Future
在下一个事件循环中执行并打印所有文本。这就是输出按调用顺序排列的原因:
事件循环中的循环 1之前
事件循环中的
循环 2之前
事件循环
中的
循环 3 之前
而不是按计划顺序。