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

标签 asynchronous dart

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

以下描述了变化:

“有什么变化? 在所有平台上,写入 stdout 和 stderr 曾经是阻塞的。作为清理的一部分,它现在与 dart:io 中的任何其他流一样是异步/非阻塞的。 如何更新我的代码? 大多数代码应该像以前一样工作,除了调用“exit”时的少数情况:“

我想实现的一个小例子如下:

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();
}

在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”后出现所有终端输出,这会终止程序并刷新输出缓冲区(出现)。第一个终端输出“Enter Name :”是唯一应该出现的输出。

似乎标准输出没有“刷新”方法。

我确实尝试过将 stdout 用于 future,但我无法让它正常运行。

我怎样才能让它按照需要的方式工作?

以下使用 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>

最佳答案

“刷新”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);
}

向 IOSink 添加一个 flush,这正是我们应该考虑的一个选项。

注意这其实不是IO层面的'flushing',而是会等待Stream读取结束,也就是等待Stream 可能被操作系统暂停和恢复。

关于asynchronous - Dart 中的 stdout.write() 显然已从同步更改为异步,但我该如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464471/

相关文章:

javascript - 等待的 Promises 创建 Array.map 返回 <pending>

validation - 带TextFormField的onLeave-Flutter/Dart

flutter - Flutter:如何在出现已访问过的页面时始终触发功能

javascript - AngularJS 等待 foreach 内的所有异步调用完成

javascript - 使用 Async.parallel 我的参数的生命周期不会超过使用 MongoDB 的 NodeJS 中的异步调用

dart - 是否可以在 angulardart 中逐个模块地分部分加载应用程序

firebase - 如何使用DocumentSnapshot而不是QuerySnapshot?

dart - 动态创建自定义组件

node.js - Node.Js 异步函数中调用的异步函数

javascript - 每个数组元素的异步调用并等待完成