事件队列和微任务队列

时间:2019-01-14 11:28:40

标签: dart flutter

在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

2 个答案:

答案 0 :(得分:2)

一般读者注意事项:

  • 事件循环有两个任务队列:微任务队列和事件队列。
  • “微任务队列”中的任何任务总是在“事件队列”中的下一个任务之前运行。
  • 微任务通常由系统安排,而事件队列任务通常来自外部事件(IO,应用程序事件等)。

我相信以下几点可以解释您所观察到的行为:

  • Future.value()构造函数在微任务队列上调度微任务。

  • 另一方面,Future()构造函数在事件队列中安排常规任务。

您共享的原始链接现在仅可用作存档:

尽管如此,仍然值得一读。

答案 1 :(得分:1)

如果您在不调用.then

的情况下调用方法,就会出现这种情况
  

将任务添加到微任务队列的一种方法是在   未来已经完成。

因此,当您致电myFunction().then(print);时,将来会添加到微任务队列中。

在不使用“ .then”的情况下拨打电话时的一些事实: 根据{{​​3}},有2个错误。 这些错误已修复,但问题仍然存在:(

  

这些错误的结果:您计划的第一个任务   scheduleMicrotask()似乎在事件队列中。

     

一种解决方法是将您的第一个调用放在scheduleMicrotask()之前   您第一次致电new Future()