【问题标题】:How to do several asynchronous I/O actions in Dart cleanly (Isolates)?如何在 Dart 中干净利落地执行多个异步 I/O 操作(Isolates)?
【发布时间】:2012-02-07 21:34:39
【问题描述】:
在 Dart 中,有一个 Isolates 的概念。我有一个应用程序(我正在 Dart 中进行试验),它有很多异步 IO,其中每个调用(它们是数据库调用)都依赖于前一个。所以我最终陷入了嵌套回调地狱。
我想知道 Isolates 是否可以解决嵌套回调问题,但它看起来有点冗长,我不确定它是否适合。
在下一个 ECMAScript Harmony 中也提出了可以解决这些问题的生成器,但是您目前如何在 Dart 中以干净的方式进行大量异步 IO?
【问题讨论】:
标签:
dart
dart-async
dart-isolates
【解决方案1】:
您可以使用Future's 和Completers 将工作链接在一起。以下未来返回来自process 的“ls”命令的结果:
Future<String> fetch(String dir) {
final completer = new Completer();
Process process = new Process.start('ls', [dir]);
process.exitHandler = (int exitCode) {
StringInputStream stringStream = new StringInputStream(process.stdout);
stringStream.dataHandler = () {
String content = stringStream.read();
completer.complete(content);
process.close();
};
};
process.errorHandler = (var error) {
completer.completeException(error);
return true;
};
return completer.future;
};
然后你可以像这样链接在一起:
fetch('/').then((val) => fetch("/usr").then((val) => fetch("/tmp")));
不是最漂亮的解决方案,但这就是我现在得到的。