2015-05-12 63 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

感謝您的期待。我想知道爲什麼它有效,但它似乎確實如此。必須仔細檢查。 –