【问题标题】:Dart async/await encapsulationDart 异步/等待封装
【发布时间】:2015-05-12 08:54:51
【问题描述】:

我想返回小数的小数,但如果函数花费太多时间,函数必须放弃。我试过这个,但它不起作用......我可能做错了什么。你能告诉我我的错误吗?

String decimalToFractional(double d) async {
  var df = 1.0;
  var top = 1;
  var bot = 1;

  var future = new Future<String>(() {
    while (df != d) {
      if (df < d) {
        top += 1;
      } else {
        bot += 1;
        top = (d * bot).toInt();
      }
      df = top / bot;
    }
    return new Future.value('$top/$bot');
  });
  future.timeout(new Duration(seconds: 2), onTimeout: () => new Future.value(d.toString()));
  return await future;
}

【问题讨论】:

  • 到底是怎么不工作的?
  • 我得到了一个未来的实例而不是一个值。
  • 近距离投票完全没有必要。这个问题很清楚,很适合 StackOverflow。
  • 您正试图用分数来近似双精度数。由于所有双精度值都是二进制值,因此它们始终是 2 的幂的分数。如果您想要一个不精确但足够接近的近似值,从 int/2^n 分数开始可能会更快,而不是从头开始.无论如何,您可能会失去乘法和除法的精度。
  • @Irn 我不太明白,你能举个例子吗?

标签: dart dart-async


【解决方案1】:

这段代码有几个问题。 如果你想返回异步操作的结果,返回类型必须是Future&lt;...&gt;

Future<String> decimalToFractional(double d) async {

然后您可以像

一样使用结果
main() async {
  print(await decimalToFractional(123456789.123456789));
}

如果要让超时生效,则需要返回事件循环。只要同步执行正在运行,超时就不会触发。 另见https://stackoverflow.com/a/22473556/217408

【讨论】:

  • 这行不通,因为你上面所说的原因 - 为了让计时器工作,控制需要返回到事件循环。循环运行时,timedOut 变量永远不会设置为 true。您可以改为使用秒表:var sw = new StopWatch()..start(); while (df != d) { if (sw.elapsedMilliseconds &gt;= 2000) { return "$top/$bot"; }; ...} 。
  • 感谢收看。我想知道为什么它会起作用,但似乎确实如此。必须仔细检查。
  • 如果同步版本似乎快了很多,并且在完成后timedOut 被设置为true。
猜你喜欢
  • 2017-12-11
  • 2020-01-14
  • 2017-12-07
  • 2021-10-04
  • 2023-03-10
  • 2019-11-29
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多