在Dart文档事件环和省道(2013年)中,它提到将任何Future添加到Event队列中。
它还提到,Microtask队列总是首先运行,然后是Event队列。
这个文档是旧的,并且似乎是面向web开发的,所以我不确定这是否和我编写这段代码时的情况不同。
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发布于 2019-01-14 12:23:07
如果您调用方法而不调用.then,则情况就是如此。
将任务添加到microtask队列的一种方法是在一个已经完成的未来上调用然后()。
因此,当您调用myFunction().then(print);时,未来将添加到微任务队列中。
在没有“.then”的情况下调用时,有一些额外的事实:根据文档,有两个bug。这些bug已经修复,但问题仍然存在:( )
这些错误的结果:您使用scheduleMicrotask()调度的第一个任务似乎在事件队列中。 解决办法是在第一次调用新的未来()之前先调用scheduleMicrotask()
发布于 2020-06-06 10:32:41
普通读者注意事项:
我相信以下几点解释了你所观察到的行为:
Future.value()构造函数在微任务队列上调度一个微任务。Future()构造函数在事件队列上调度一个常规任务。您共享的原始链接现在只能作为归档文件使用:
不过,它还是值得一读的。
https://stackoverflow.com/questions/54180637
复制相似问题