Как правильно выполнить несколько действий асинхронного ввода-вывода в Dart (Изоляты)? - PullRequest
8 голосов
/ 08 февраля 2012

В Дартсе есть концепция Изолятов.У меня есть приложение (которое я экспериментирую в Dart), которое имеет много асинхронного ввода-вывода, где каждый вызов (это вызовы базы данных) зависят от предыдущего.Так что я попал в ад вложенного обратного вызова.

Мне было интересно, могут ли изоляты решить этот вложенный суп обратного вызова, но он выглядит немного многословно, и я не уверен, подходит ли он хорошо.

В следующей ECMAScript Harmony также предложены генераторы, которые могли бы решить эти проблемы, но как бы вы в настоящее время делали много асинхронного ввода-вывода в Dart чистым способом?

1 Ответ

6 голосов
/ 08 февраля 2012

Вы можете использовать Future's и Completers для цепочки совместной работы. Следующее будущее возвращает результат команды '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")));

Не самое симпатичное решение, но это то, что я получаю сейчас.

...