在Dart文档The Event Loop and Dart (2013)中,它提到将任何Future
添加到Event
队列中。
它还提到Microtask
队列总是先运行,然后是Event
队列。
该文档较旧,似乎适合于Web开发,因此我不确定Flutter是否与我编写此代码时有所不同。
Future<String> myFunction() => new Future.value('Hello');
Future<String> myFunction2() => new Future.value('Hello2');
Future<void> mainTest() async {
debugPrint("Sync1");
myFunction().then(debugPrint);
scheduleMicrotask(() { debugPrint("Microtask"); });
myFunction2().then(debugPrint);
debugPrint("Sync2");
}
我得到
的输出I/flutter ( 6731): Sync1
I/flutter ( 6731): Sync2
I/flutter ( 6731): Hello
I/flutter ( 6731): Microtask
I/flutter ( 6731): Hello2
但是,如果所有微任务都应该在下一个事件循环之前运行,不是吗?
I/flutter ( 6731): Sync1
I/flutter ( 6731): Sync2
I/flutter ( 6731): Microtask // This running first before the Futures?
I/flutter ( 6731): Hello
I/flutter ( 6731): Hello2
答案 0 :(得分:2)
一般读者注意事项:
我相信以下几点可以解释您所观察到的行为:
Future.value()
构造函数在微任务队列上调度微任务。
另一方面,Future()
构造函数在事件队列中安排常规任务。
您共享的原始链接现在仅可用作存档:
尽管如此,仍然值得一读。
答案 1 :(得分:1)
如果您在不调用.then
将任务添加到微任务队列的一种方法是在 未来已经完成。
因此,当您致电myFunction().then(print);
时,将来会添加到微任务队列中。
在不使用“ .then
”的情况下拨打电话时的一些事实:
根据{{3}},有2个错误。 这些错误已修复,但问题仍然存在:(
这些错误的结果:您计划的第一个任务 scheduleMicrotask()似乎在事件队列中。
一种解决方法是将您的第一个调用放在scheduleMicrotask()之前 您第一次致电new Future()