2015-05-12 61 views
1

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

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; 
} 
+0

它究竟如何不起作用? – Pavlo

+0

我得到了未来的实例而不是价值。 – Druxtan

+0

近距离投票是完全没有必要的。这个问题很清楚,非常适合StackOverflow。 –

回答

1

这段代码有几个问题。 如果你想返回一个异步操作的返回类型具有的结果是Future<...>

Future<String> decimalToFractional(double d) async { 

如果你想超时生效,你需要你就可以消耗像

main() async { 
    print(await decimalToFractional(123456789.123456789)); 
} 

结果返回到事件循环。只要同步执行正在运行,超时不会触发。 另请参见https://stackoverflow.com/a/22473556/217408

+0

我更新了我的答案。 –

+2

这是行不通的,因为你上面陈述的原因 - 要使计时器工作,控制器需要返回到事件循环。 timedOut变量在循环运行时从不设置为true。你可以做的是使用秒表:var sw = new StopWatch().. start(); while(df!= d){if(sw.elapsedMilliseconds> = 2000){return“$ top/$ bot”; }; ''。 – lrn

+0

感谢您的期待。我想知道为什么它有效,但它似乎确实如此。必须仔细检查。 –