首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件队列和微任务队列

事件队列和微任务队列
EN

Stack Overflow用户
提问于 2019-01-14 11:28:39
回答 2查看 1.3K关注 0票数 10

在Dart文档事件环和省道(2013年)中,它提到将任何Future添加到Event队列中。

它还提到,Microtask队列总是首先运行,然后是Event队列。

这个文档是旧的,并且似乎是面向web开发的,所以我不确定这是否和我编写这段代码时的情况不同。

代码语言:javascript
复制
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");
}

我得到的输出

代码语言:javascript
复制
I/flutter ( 6731): Sync1
I/flutter ( 6731): Sync2
I/flutter ( 6731): Hello
I/flutter ( 6731): Microtask
I/flutter ( 6731): Hello2

但是,如果所有的微任务都要在下一个事件循环之前运行,难道不是吗?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-14 12:23:07

如果您调用方法而不调用.then,则情况就是如此。

将任务添加到microtask队列的一种方法是在一个已经完成的未来上调用然后()。

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

在没有“.then”的情况下调用时,有一些额外的事实:根据文档,有两个bug。这些bug已经修复,但问题仍然存在:( )

这些错误的结果:您使用scheduleMicrotask()调度的第一个任务似乎在事件队列中。 解决办法是在第一次调用新的未来()之前先调用scheduleMicrotask()

票数 5
EN

Stack Overflow用户

发布于 2020-06-06 10:32:41

普通读者注意事项:

  • 事件循环有两个任务队列: Microtask队列和事件队列。
  • 微任务队列中的任何任务总是在事件队列中的下一个任务之前运行。
  • 微任务通常由系统调度,而事件队列任务通常来自外部事件(IO、app事件等)。

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

  • Future.value()构造函数在微任务队列上调度一个微任务。
  • 另一方面,Future()构造函数在事件队列上调度一个常规任务。

您共享的原始链接现在只能作为归档文件使用:

不过,它还是值得一读的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54180637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档