2013-10-19 57 views
1

我在Dart的許多地方使用stdout.write(),以免去換行。它工作正常,但最近從同步更改爲異步。我已經在Win7-32​​和Win8-64上升級到Dart 28355。Dart中的stdout.write()顯然已從同步更改爲異步,但我該如何使用它?

下面介紹的變化:

「什麼樣的變化 寫入輸出和錯誤曾經被封鎖,在所有平臺上作爲清除的一部分,這是目前異步/非阻塞任何其他?行旅中鏢:IO 如何更新我的代碼 大多數代碼應該只是像以前那樣,除極少數情況下調用「退出」的時候:」

的,我想達到什麼樣的一個小例子如下:

import 'dart:io'; 

main() { 
    String sCorrectYn; 
    while (sCorrectYn != "y") { 
    String sName = fInputString("Enter Name : ");  
    sCorrectYn = fInputString("Details Correct? (y/n) : "); 
    } 
} 

String fInputString(String sPrompt) { 
    stdout.write("\n$sPrompt"); 
    return stdin.readLineSync().toLowerCase(); 
} 
012上運行的win8以上時

端子輸出如下:

c:\Users\boh\dart-dev1\testpg001>dart testinput001.dart 

Enter Name : abcd 
n 
xxxx 
n 
zzzz 
y 

Details Correct? (y/n) : 
Enter Name : 
Details Correct? (y/n) : 
Enter Name : 
Details Correct? (y/n) : 
c:\Users\boh\dart-dev1\testpg001> 

什麼與上述發生的是,所有的終端輸出的出現後我最後輸入「Y」,這將終止該程序並刷新輸出緩衝區(它出現)。第一個終端輸出「輸入名稱:」是它應該發生的唯一輸出。

看來stdout沒有「flush」方法。

我沒有用未來的stdout做實驗,但是我無法讓它正常工作。

我怎樣才能以需要的方式工作?

以下也如使用stdout.write()所需的不工作:

import 'dart:io'; 

main() { 
    String sInput; 
    stdout.write("\nEntry 1 : "); 
    sInput = stdin.readLineSync(); 
    print("Date Entered (1) was : $sInput"); 
    stdout.write("\nEntry 2 : "); 
    sInput = stdin.readLineSync(); 
    print("Date Entered (2) was : $sInput"); 
    stdout.write("\nEntry 3 : "); 
    sInput = stdin.readLineSync(); 
    print("Date Entered (3) was : $sInput"); 
    stdout.write("\nEntry 4 : "); 
    sInput = stdin.readLineSync(); 
    print("Date Entered (4) was : $sInput"); 
    stdout.write("\nEntry 5 : "); 
    sInput = stdin.readLineSync(); 
    print("Date Entered (5) was : $sInput"); 
} 

終端顯示用於上述顯示第一行「條目1:」是當使用stdout.write(當僅需要顯示線):

c:\Users\boh\dart-dev1\testpg001>dart testinput003.dart 

Entry 1 : aaa 
Date Entered (1) was : aaa 
bbb 
Date Entered (2) was : bbb 
ccc 
Date Entered (3) was : ccc 
ddd 
Date Entered (4) was : ddd 
eee 
Date Entered (5) was : eee 

Entry 2 : 
Entry 3 : 
Entry 4 : 
Entry 5 : 
c:\Users\boh\dart-dev1\testpg001> 
+0

您的while循環阻止任何異步發生。在這種情況下,你真的需要切換到未來。請展示你用期貨嘗試過的東西。 – GameAlchemist

+0

我試過沒有循環,結果是一樣的。除了第一行之外,沒有stdout.write()的輸出,直到程序終止。我對Future沒有運氣,我不知道是否有解決方案,對我來說似乎沒有。如果有人能說明如何使它工作,我將不勝感激,因爲我需要它與輸入(readLineSync())一起工作。我需要處理對提示的連續響應輸入。 –

回答

0

要「刷」一IOSink可以通過使用StreamController創建一個新的Stream可以等待實現的能力。我已經使用writeAndFlush輔助方法重寫了上面的示例。

import 'dart:async'; 
import 'dart:convert'; 
import 'dart:io'; 

main() { 
    void loop() { 
    fInputString("Enter Name : ") 
     .then((_) => fInputString("Details Correct? (y/n) : ")) 
     .then((sCorrectYn) { 
     if (sCorrectYn != "y") loop(); 
     }); 
    } 
    loop(); 
} 

Future<String> fInputString(String sPrompt) { 
    return writeAndFlush(stdout, "\n$sPrompt") 
    .then((_) { 
     return stdin.readLineSync().toLowerCase(); 
    }); 
} 

Future writeAndFlush(IOSink sink, object) { 
    return sink.addStream(
    (new StreamController() 
     ..add(UTF8.encode(object.toString())) 
     ..close()) 
     .stream); 
} 

添加flush到IOSink,那正是這一點,是我們應該考慮的選擇。

請注意,這實際上不是在IO級別上「刷新」,而是等待Stream讀取結束,即等待Stream可能被操作系統暫停和恢復。

+0

這就像我看到的那樣,如果我錯了,請糾正我。雖然這個答案解決了基本問題,並且很容易在一個小測試程序中實現,但它將我的程序變成了一個同步程序,變成了一個異步程序(終端輸入),這再次使得它變得複雜。在過去,該程序使用異步輸入。然後從內存中引入readByteSync(),然後readLineSync()。這使得程序可以同步化,簡化了程序。爲了將它改回異步,我相信這說明了不輸出換行符的終端需要進行同步寫入。 –

+0

。已經有「打印」語句是同步的,但它會輸出一個換行符,這在提示輸入時不需要。在我看來,儘管我認爲異步寫入是可取的,同步寫入也是可取的,我們現在有一個同步讀取,但不是沒有換行的同步寫入。我不在乎它叫什麼,但我認爲我需要它(不用換行符同步寫入控制檯)。 –