2014-01-07 34 views
2

這是我在Dart的第一個程序,我只是想看看它是異步功能。知道的JavaScript我寫以下代碼:鏢計時器出錯了?

import 'dart:async' show Timer; 
import 'dart:math'; 

void main() { 
    //Recursion 
    fib1(x) => x > 1 ? fib1(x-1) + fib1(x-2) : x; 
    //Mathematical 
    num fi = (1 + sqrt(5))/2; 
    fib2(x) => x > 1 ? ((pow(fi, x) + pow(1 - fi, x))/sqrt(5)).round() : x; 
    //Linear 
    fib3(x) { 
    if(x < 2) return x; 
    int a1 = 0; 
    int a2 = 1; 
    int sum = 0; 
    for(int i = 1; i < x; i++) { 
     sum = a2 + a1; 
     a1 = a2; 
     a2 = sum; 
    } 

    return sum; 
    } 

    Timer.run(() => print('Fib1:' + fib1(41).toString())); 
    Timer.run(() => print('Fib2:' + fib2(41).toString())); 
    Timer.run(() => print('Fib3:' + fib3(41).toString())); 
} 

並在鏢編輯器輸出是:

Fib1:165580141 
Fib2:165580141 
Fib3:165580141 

全部3輸出被同時打印。這不是錯的嗎? fib3要快得多,應該首先打印。

回答

4

運行異步並不意味着多線程。飛鏢運行單線程。您可以產生分離物以並行運行代碼。

當你添加打印語句

{ 
    //... 
    Timer.run(() => print('Fib1:' + fib1(41).toString())); 
    Timer.run(() => print('Fib2:' + fib2(41).toString())); 
    Timer.run(() => print('Fib3:' + fib3(41).toString())); 
    print('exit'); 
} 
你的三個 Timer.run(...語句後

你窺見什麼異步左右。

您提供的關閉Timer.run(...)被安排在以後執行,並執行main的下一個語句。 只要事件循環有時間處理計劃任務,就會逐個執行閉包。

你可以在這裏找到更深入的信息:The Event Loop and Dart

**編輯**

當你運行它這樣的輸出可能更有意義,你

Timer.run(() => print('Fib1: ${new DateTime.now()} - result: ${fib1(41)}')); 
    Timer.run(() => print('Fib2: ${new DateTime.now()} - result: ${fib2(41)}')); 
    Timer.run(() => print('Fib3: ${new DateTime.now()} - result: ${fib3(41)}')); 
    print('exit'); 

* *輸出**

exit 
Fib1: 2014-01-07 12:00:46.953 - result: 165580141 
Fib2: 2014-01-07 12:00:56.208 - result: 165580141 
Fib3: 2014-01-07 12:00:56.210 - result: 165580141 

並非如此,速度更快的任務首先結束。 Timer.run()日程安排以供稍後執行並繼續執行main()。當事件循環取回程序流的控制權時,它會一次一個地執行計劃任務。

也許輸出通過DartEditor輸出窗口或shell以某種方式進行緩衝並分批顯示。 這可能會導致一次印刷結果的印象。

**編輯2 **

我剛纔看到的結果是由一個寫一個。 很容易驗證,如果你移動在最後位置(Fib3

+0

緩慢Fib1我不認爲異步必然是多線程的,我在NodeJS中也有單線程異步I/O程序。而且我知道更快的計劃首先結束。 Fib3比fib2和fib1快了許多,它仍然等待它們完成,然後所有的打印都會一個一個地同步執行,這很奇怪。 –

+0

感謝您澄清您的問題。 –

+0

是的,我認爲某種使用緩衝輸出的順序執行,但是它們在文檔上告訴你的東西很奇怪。我認爲'Timer.run'相當於javascript的'setTimeout(callback,0)' –