什么代码放在事件循环上——Future 主体或在它完成时执行的调用(然后)?
What code is put on the Event Loop - the Future body or the call to execute upon its completion (then)?
我有一些关于 Dart Futures
的基本问题,我自己似乎无法得到答案。考虑以下代码:
Future(
() => print('from Future') // 1
).then(
(_) => print('after Future') // 2
);
- 什么放在事件循环中,代码块 1 或 2?
- 如果 1 被放入事件循环,那么 2 是在它之后立即同步执行,还是也被放入事件循环,以便稍后执行?
- 如果立即执行 2,那么 2 是否有意义:
Future.delayed(someDuration, () => print('after Future'));
用例是什么?喜欢拆分更长的 'task' 以便其他代码在两者之间 运行 吗?是不是像在 Flutter 中那样在实践中实际做了一些事情来防止 'jank'?
编辑:我发现了一篇非常有见地的文章:https://webdev-angular3-dartlang-org.firebaseapp.com/articles/performance/event-loop#how-to-schedule-a-task,它几乎回答了我在这里提出的每一个问题。
您正在调用的构造函数是 Future()
,记录为:
Creates a future containing the result of calling computation
asynchronously with Timer.run.
If the result of executing computation
throws, the returned future is completed with the error.
If the returned value is itself a Future, completion of the created future will wait until the returned future completes, and will then complete with the same result.
If a non-future value is returned, the returned future is completed with that value.
https://api.dart.dev/stable/2.8.2/dart-async/Future/Future.html
其中 Timer.run
记录为:
Runs the given callback
asynchronously as soon as possible.
This function is equivalent to new Timer(Duration.zero, callback)
.
https://api.dart.dev/stable/2.8.2/dart-async/Timer/run.html
因此,由于我们正在创建一个已经完成的计时器,它会立即进入事件循环。
因此,有了这些知识,我们可以回答您的问题:
什么放在事件循环中,代码块 1 或 2?
块 1 放在事件循环中。由于区块 2 依赖于区块 1 的结果,因此它不会被放入任何队列。相反,当块 1 返回结果时,块 2 将收到通知。
如果 1 被放入事件循环,2 是在它之后立即同步执行,还是也被放入事件循环,以便稍后执行?
据我了解文档,块 2 将在块 1 的一部分完成时立即同步执行(除非未来已经完成,然后将触发微任务):
Register callbacks to be called when this future completes.
When this future completes with a value, the onValue callback will be called with that value. If this future is already completed, the callback will not be called immediately, but will be scheduled in a later microtask.
https://api.dart.dev/stable/2.8.2/dart-async/Future/then.html
如果立即执行 2,那么 2 是否有意义:
具体的例子意义不大。但是,是的,如果你想在事件循环上安排较小的任务,你可以使用 Future.delayed
。应该注意的是,Dart 是单线程的,因此您不能使用 Future.delayed
.
将任务安排在另一个线程中 运行ning
但是在 Flutter 的上下文中,您确实希望有多个较小的任务,因此可以在每个任务之间绘制 UI。但是如果你要进行一些繁重的计算,你应该在另一个线程中正确地使用 Isolate
到 运行 这些。
我有一些关于 Dart Futures
的基本问题,我自己似乎无法得到答案。考虑以下代码:
Future(
() => print('from Future') // 1
).then(
(_) => print('after Future') // 2
);
- 什么放在事件循环中,代码块 1 或 2?
- 如果 1 被放入事件循环,那么 2 是在它之后立即同步执行,还是也被放入事件循环,以便稍后执行?
- 如果立即执行 2,那么 2 是否有意义:
Future.delayed(someDuration, () => print('after Future'));
用例是什么?喜欢拆分更长的 'task' 以便其他代码在两者之间 运行 吗?是不是像在 Flutter 中那样在实践中实际做了一些事情来防止 'jank'?
编辑:我发现了一篇非常有见地的文章:https://webdev-angular3-dartlang-org.firebaseapp.com/articles/performance/event-loop#how-to-schedule-a-task,它几乎回答了我在这里提出的每一个问题。
您正在调用的构造函数是 Future()
,记录为:
Creates a future containing the result of calling
computation
asynchronously with Timer.run.If the result of executing
computation
throws, the returned future is completed with the error.If the returned value is itself a Future, completion of the created future will wait until the returned future completes, and will then complete with the same result.
If a non-future value is returned, the returned future is completed with that value.
https://api.dart.dev/stable/2.8.2/dart-async/Future/Future.html
其中 Timer.run
记录为:
Runs the given
callback
asynchronously as soon as possible.This function is equivalent to
new Timer(Duration.zero, callback)
.
https://api.dart.dev/stable/2.8.2/dart-async/Timer/run.html
因此,由于我们正在创建一个已经完成的计时器,它会立即进入事件循环。
因此,有了这些知识,我们可以回答您的问题:
什么放在事件循环中,代码块 1 或 2?
块 1 放在事件循环中。由于区块 2 依赖于区块 1 的结果,因此它不会被放入任何队列。相反,当块 1 返回结果时,块 2 将收到通知。
如果 1 被放入事件循环,2 是在它之后立即同步执行,还是也被放入事件循环,以便稍后执行?
据我了解文档,块 2 将在块 1 的一部分完成时立即同步执行(除非未来已经完成,然后将触发微任务):
Register callbacks to be called when this future completes.
When this future completes with a value, the onValue callback will be called with that value. If this future is already completed, the callback will not be called immediately, but will be scheduled in a later microtask.
https://api.dart.dev/stable/2.8.2/dart-async/Future/then.html
如果立即执行 2,那么 2 是否有意义:
具体的例子意义不大。但是,是的,如果你想在事件循环上安排较小的任务,你可以使用 Future.delayed
。应该注意的是,Dart 是单线程的,因此您不能使用 Future.delayed
.
但是在 Flutter 的上下文中,您确实希望有多个较小的任务,因此可以在每个任务之间绘制 UI。但是如果你要进行一些繁重的计算,你应该在另一个线程中正确地使用 Isolate
到 运行 这些。