gpt4 book ai didi

dart - 是否可以无延迟地使用超时?

转载 作者:行者123 更新时间:2023-12-03 04:15:20 24 4
gpt4 key购买 nike

我只是想了解超时在 Futures 中是如何工作的,但我无法中断任何更复杂的事情。看看这个非常简单的代码,我认为如果该循环花费的时间超过 1 秒,它会出现异常,但它并没有发生。任何人都可以请解释这里发生了什么?

我正在尝试使用此工具:https://dartpad.dartlang.org/

import 'dart:async';

void main() {
new Future(() {
var sum = 0;
for (var i = 0; i < 500000000; i++) {
sum += i;
}
return sum;
}).timeout(new Duration(seconds: 1)).then(print).catchError(print);
}

最佳答案

首先Future.timeout不会中断任何计算。
它创建一个新的 Future以原始 Future 的值完成, 或者超时的结果,如果原来的 future 没有及时完成。它更像是需要两个 future :原始的一个和一个使用 Future.delayed 创建的 future 。 ,然后创建第三个 Future这将与前两个完成的结果一起完成。

没有信号返回到最终将完成原始 future 的计算。除非你让它停止,否则它不会停止。
Future.timeout 的用例比如说,一个似乎没有及时给出结果的网络连接。您无法停止该请求,但您可以停止等待答案,这就是 timeout做。

您的示例中发生的情况是:

  • 您创建一个 Future , f1 与 Future构造函数。这会安排一个持续时间为零的计时器来调用参数函数。
  • 然后您调用timeout在 f1 上。这将启动一个持续时间为一秒的计时器,并返回一个 future f2。
  • 然后您调用then在 f2 上使用 print作为论据。这会在 f2 上放置一个监听器并返回一个 future 的 f3。
  • 然后您调用catchError在 f3 上,它在 f3 上放置一个错误监听器并返回一个 future 的 f4(然后被忽略)。
  • 然后控制返回事件循环,下一个事件是零持续时间计时器。
  • Future 的参数构造函数被调用。它计数到 500000000,然后返回一个值 v 并以此完成 f1。
  • f1 的结果被传播到 f2,f2 也以 v 结束。
  • f2 的结果由 print 打印, f3 以 null 结束。
  • catchError 忽略 f4 的结果f4 以 null 结束。
  • 然后控制返回到事件循环。下一个事件是由 Future.timeout 启动的 1 秒计时器。 .可能已经过了一秒多,但这是它运行的最早机会。
  • Future.timeout计时器回调看到 f2 已经完成并且什么都不做。
  • 控制返回到事件循环,因为它是空的,所以程序结束。
  • 关于dart - 是否可以无延迟地使用超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59500385/

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