gpt4 book ai didi

dart - 什么代码放在事件循环上 - future 主体或完成后执行的调用(然后)?

转载 作者:行者123 更新时间:2023-12-03 03:34:41 25 4
gpt4 key购买 nike

我有几个关于 Dart 的基本问题 Futures我似乎无法得到自己的答案。考虑以下代码:

Future(
() => print('from Future') // 1
).then(
(_) => print('after Future') // 2
);
  • 事件循环,代码块 1 或 2 上放了什么?
  • 如果将 1 放在 Event Loop 上,那么 2 是在它之后立即同步执行,还是也放在 Event Loop 上,以便稍后执行?
  • 如果 2 立即执行,那么 2 是否有意义:

  • Future.delayed(someDuration, () => print('after Future'));

    用例是什么?喜欢拆分更长的“任务”以便在其间运行其他代码?它是在实践中实际完成的,比如在 Flutter 中,以防止“卡顿”吗?

    编辑 : 发现一篇很有见地的文章: 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 上放了什么?
    block 1 放在事件循环中。由于 block 2 依赖于 block 1 的结果,因此它不会被放入任何队列。相反,当 block 1 返回其结果时,将通知 block 2。
    如果将 1 放在 Event Loop 上,那么 2 是在它之后立即同步执行,还是也放在 Event Loop 上,以便稍后执行?
    据我了解文档, block 2 将在 block 1 的一部分完成时立即同步执行(除非 future 已经完成,然后将触发微任务):

    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在另一个线程中运行这些。

    关于dart - 什么代码放在事件循环上 - future 主体或完成后执行的调用(然后)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61758228/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com