Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Dart中的stdout.write()显然已从同步更改为异步,但如何使用它?_Asynchronous_Dart - Fatal编程技术网

Asynchronous Dart中的stdout.write()显然已从同步更改为异步,但如何使用它?

Asynchronous Dart中的stdout.write()显然已从同步更改为异步,但如何使用它?,asynchronous,dart,Asynchronous,Dart,我在Dart中的许多地方使用stdout.write(),以避免转到新的行。它工作正常,但最近已从同步更改为异步。我刚刚在Win7-32和Win8-64上升级到Dart 28355 以下描述了更改: “有什么变化? 在所有平台上,对stdout和stderr的写入过去都是阻塞的。作为清理的一部分,这现在与dart:io中的任何其他流一样是异步/非阻塞的。 如何更新代码? 除了调用“退出”时的少数情况外,大多数代码都应该像以前一样工作: 我希望实现的一个小例子如下: import 'dart:io

我在Dart中的许多地方使用stdout.write(),以避免转到新的行。它工作正常,但最近已从同步更改为异步。我刚刚在Win7-32和Win8-64上升级到Dart 28355

以下描述了更改:

“有什么变化? 在所有平台上,对stdout和stderr的写入过去都是阻塞的。作为清理的一部分,这现在与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”语句,但它输出一个换行符,提示输入时不需要换行符。在我看来,我认为异步写入是可取的,同步写入也是可取的,我们现在有一个同步读取,但没有换行符的同步写入。我不在乎它叫什么,但我想我需要它(不使用换行符同步写入控制台)。