请在这里解释一下 Dart 中 Futures 的行为

Be *_*ppy 2 dart

import 'dart:async';

void main() async {
  Future.microtask(() => print(1));
  Future.value(2).then(print);
  Future.sync(() => print(3));
  Future.sync(() => 4).then(print);
}
Run Code Online (Sandbox Code Playgroud)

我在 dartpad 中观察到的输出:

import 'dart:async';

void main() async {
  Future.microtask(() => print(1));
  Future.value(2).then(print);
  Future.sync(() => print(3));
  Future.sync(() => 4).then(print);
}
Run Code Online (Sandbox Code Playgroud)

为什么微任务没有首先执行?两个 Future.sync 函数以不同的顺序打印它们有什么不同。

jul*_*101 5

该方法的一个重要方面.then()是您可以在文档中找到以下内容:

当这个 future 以 a 完成时value,将使用该值调用 onValue 回调。如果这个 future 已经完成,回调不会立即被调用,而是被安排在稍后的微任务中。

https://api.dart.dev/stable/2.15.1/dart-async/Future/then.html

那么发生的事情是:

  1. 您安排一个微任务来调用print(1)
  2. Future.value(2)同步完成,以下操作.then将在微任务中完成。微任务队列现在是:print(1), print(2)
  3. 第三行是同步的,并且立即完整运行,因此我们运行print(3). 这给出了输入中的第一行。
  4. 我们安排一个新的微任务,因为.then(). 微任务队列现在是:print(1), print(2), print(4)

完成后,main()我们按微任务出现的顺序运行微任务,这解释了其余的输出。

Future一个重要的注意事项是,您永远不会等待从方法返回的任何内容,因此任何异步内容将在完成.then()后首先执行。main()