Asynchronous Dart中的stdout.write()显然已从同步更改为异步,但如何使用它?
我在Dart中的许多地方使用stdout.write(),以避免转到新的行。它工作正常,但最近已从同步更改为异步。我刚刚在Win7-32和Win8-64上升级到Dart 28355 以下描述了更改: “有什么变化? 在所有平台上,对stdout和stderr的写入过去都是阻塞的。作为清理的一部分,这现在与dart:io中的任何其他流一样是异步/非阻塞的。 如何更新代码? 除了调用“退出”时的少数情况外,大多数代码都应该像以前一样工作: 我希望实现的一个小例子如下:Asynchronous Dart中的stdout.write()显然已从同步更改为异步,但如何使用它?,asynchronous,dart,Asynchronous,Dart,我在Dart中的许多地方使用stdout.write(),以避免转到新的行。它工作正常,但最近已从同步更改为异步。我刚刚在Win7-32和Win8-64上升级到Dart 28355 以下描述了更改: “有什么变化? 在所有平台上,对stdout和stderr的写入过去都是阻塞的。作为清理的一部分,这现在与dart:io中的任何其他流一样是异步/非阻塞的。 如何更新代码? 除了调用“退出”时的少数情况外,大多数代码都应该像以前一样工作: 我希望实现的一个小例子如下: import 'dart: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();
}
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>
在win8上运行上述程序时的终端输出如下:
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();
}
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”之后,所有的终端输出都会出现,这会终止程序并刷新输出缓冲区(它会出现)。第一个终端输出“EnterName:”是唯一一个在应该时发生的输出
似乎没有标准输出的“刷新”方法
我曾经用stdout做过一个关于未来的实验,但我无法让它正常工作
我怎样才能让它按需要的方式工作
使用stdout.write()时,以下操作也无法按需要工作:
当使用stdout.write()时,上面的终端显示显示第1行“条目1:”仅在需要时显示该行:
“刷新”一个IOSink
的能力可以通过使用StreamController
创建一个可以等待的新流来实现。我使用writeAndFlush
helper方法重写了上面的示例
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);
}
导入'dart:async';
导入“dart:convert”;
导入“dart:io”;
main(){
void循环(){
fInputString(“输入名称:”)
。然后(())=>fInputString(“详细信息正确吗?(y/n):”)
.然后((斯科勒廷){
if(sCorrectYn!=“y”)循环();
});
}
loop();
}
Future fInputString(字符串sPrompt){
返回writeAndFlush(标准输出“\n$sPrompt”)
.然后(){
返回stdin.readLineSync().toLowerCase();
});
}
Future writeAndFlush(IOSink接收器,对象){
返回sink.addStream(
(新的StreamController()
…添加(UTF8.encode(object.toString()))
…关闭())
(溪流);
}
将一个<代码> FLASH <代码>添加到IOSink,这正是我们应该考虑的选项。
请注意,这实际上不是IO级别的“刷新”,而是等待流
被读取结束,也就是说,等待流
被操作系统暂停和恢复。您的while循环正在阻止任何异步事件的发生。在这种情况下,你真的需要转向未来。请展示你在期货方面的尝试。我在没有循环的情况下尝试了,结果是一样的。在程序终止之前,除了第一行之外,stdout.write()没有输出。我对未来没有运气,我不知道是否有解决办法,对我来说似乎没有。如果有人能举例说明如何使它工作,我将不胜感激,因为我需要它与输入(readLineSync())一起工作。我需要处理对提示的连续响应的输入。这是我看到的,所以如果我错了,请纠正我。虽然这个答案解决了基本问题,并且很容易在一个小测试程序中实现,但它将我的同步程序变成了异步程序(终端输入),这(再次)使它复杂化。在过去,程序使用异步输入。然后从内存中引入readByteSync(),然后引入readLineSync()。这使得程序能够同步,从而简化了程序。要将其改回异步,我相信这说明了不输出换行符的终端需要同步写入。。已经有同步的“print”语句,但它输出一个换行符,提示输入时不需要换行符。在我看来,我认为异步写入是可取的,同步写入也是可取的,我们现在有一个同步读取,但没有换行符的同步写入。我不在乎它叫什么,但我想我需要它(不使用换行符同步写入控制台)。