2013-02-11 12 views
5

Come posso ottenere immediatamente il risultato di Future? Ad esempio:C'è un modo per eseguire Dart's Future in modo sincrono?

void main() { 
    Process.run('some_shell_command', []).then((ProcessResult result) { 
    print(result.stdout); // I have the output here... 
    }); 
    // ... but want it here. 
} 
+0

Non vedo un modo semplice per farlo. Qual è il problema con l'utilizzo del callback? Stai solo cercando di ridurre il nesting di callback? –

+0

Voglio solo sapere se è possibile. – Leksat

risposta

2

Spiacente, semplicemente non è possibile.

ci sono alcuni casi in cui una funzione restituisce new Future.immediate(value) e plausibilmente si potrebbe ottenere il valore, ma:

  1. Questo non è uno di quei casi. I processi vengono eseguiti in modo completamente asincrono dalla VM.
  2. La possibilità di accedere direttamente al valore di un Futuro è stata rimossa nell'aggiornamento di libv2.

Il modo per gestire questa situazione è quello di avere la funzione di contenimento Process.run() restituire un futuro, e fare tutto la logica del callback, che ti sembra di conoscere, in modo da sto supponendo che il codice qui è solo un esempio e non lo stai davvero facendo in main(). In questo caso, sfortunatamente, sei praticamente sfortunato: devi rendere la tua funzione asincrona se dipendi dal conoscere il valore futuro o che l'operazione è stata completata.

Async in un ambiente a thread singolo, come Dart e Javascript, è virale e si propaga sempre sullo stack delle chiamate. Ogni funzione che chiama questa funzione e ogni funzione che le chiama ecc. Deve essere asincrona.

2

No.

Il punto di API acync che quando l'operazione asincrona termina, il codice riceve il risultato come un callback.

Un altro modo per scrivere il codice, se stai cercando di ridurre la nidificazione, potrebbe essere da passando una funzione al then()

void main() { 
    Process.run('some_shell_command', []).then(doSomethingWithResult); 
} 

void doSomethingWithResult(result) { 
    print(result.stdout); // I have the output here... 
} 
5

the support of await è in stato sperimentale e può essere utilizzato come:

void main() async { 
    ProcessResult result = await Process.run('some_shell_command', []); 
    print(result.stdout); // I have the output here... 
} 
+0

Vedere anche http://stackoverflow.com/questions/27212220 –

Problemi correlati