2012-02-07 15 views
8

In Dart, c'è un concetto di isolati. Ho un'applicazione (che sto sperimentando in Dart) che ha un sacco di IO asincrono in cui ogni chiamata (sono chiamate al database) dipende da quella precedente. Quindi sono finito in un inferno callback annidato.Come eseguire diverse azioni I/O asincrone in Dart in modo pulito (isolate)?

Mi stavo chiedendo se Isolates potesse risolvere quella zuppa callback annidata, ma sembra un po 'prolissa e non sono sicuro che si adatti bene.

Ci sono anche dei Generatori proposti nel prossimo ECMAScript Harmony che potrebbero risolvere queste cose, ma come faresti attualmente un sacco di IO asincrono in Dart in modo pulito?

risposta

6

È possibile utilizzare Future's e Completers per lavorare a catena insieme. Quanto segue futuro restituisce il risultato di un comando 'ls' da un process:

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

che è quindi possibile concatenare insieme in questo modo:.

fetch ('/'), poi ((val) => fetch ("/ usr"). then ((val) => fetch ("/ tmp")));

Non è la soluzione più carina, ma è quello con cui mi trovo ora.

Problemi correlati