2013-02-11 4 views
5

Wie kann ich Futures Ergebnis sofort erhalten? Zum Beispiel:Gibt es eine Möglichkeit, Dart's Future synchron zu betreiben?

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

Ich sehe keine einfache Möglichkeit, das zu tun. Was ist das Problem mit dem Rückruf? Versuchen Sie nur, die Callback-Verschachtelung zu reduzieren? –

+0

Ich möchte nur wissen, ob es möglich ist. – Leksat

Antwort

2

Sorry, es ist einfach nicht möglich.

Es gibt einige Fälle, in denen eine Funktion new Future.immediate(value) zurückgibt und möglicherweise können Sie den Wert, aber:

  1. Dies ist nicht einer jener Fälle ist. Prozesse werden vollständig asynchron von der VM ausgeführt.
  2. Die Möglichkeit, direkt auf den Wert einer Future zuzugreifen, wurde im libv2-Update entfernt.

Die Art und Weise, dies zu umgehen ist die Funktion eine Zukunft zurückkehren enthalten haben Process.run(), und alle deine Logik in den Rückruf, die Sie scheinen zu wissen, so gehe ich davon aus, dass Ihr Code hier ist nur ein Beispiel und du machst das nicht wirklich in main(). In diesem Fall haben Sie leider kein Glück - Sie müssen Ihre Funktion async machen, wenn Sie wissen, ob der zukünftige Wert bekannt ist oder ob der Vorgang abgeschlossen ist.

Async in einer single-threaded Umgebung, wie Dart und Javascript, ist viral und verbreitet immer Ihren Call-Stack. Jede Funktion, die diese Funktion aufruft, und jede Funktion, die sie aufruft usw., müssen asynchron sein.

2

Nr

Der ganze Sinn der acync APIs, dass, wenn der Asynchron-Vorgang abgeschlossen ist, Ihr Code das Ergebnis als ein Rückruf erhält.

Eine weitere Möglichkeit, den Code zu schreiben, wenn Sie Verschachtelung zu reduzieren suchen, durch vorbei in einer Funktion zum 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 wird in experimentellem Zustand sein könnte, und kann wie verwendet werden:

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

Siehe auch http://stackoverflow.com/questions/27212220 –

Verwandte Themen