8

Future の結果をすぐに取得するにはどうすればよいですか? 例えば:

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

3 に答える 3

7

のサポートはawait実験的な状態であり、次のように使用できます。

void main() async {
  ProcessResult result = await Process.run('some_shell_command', []);
  print(result.stdout); // I have the output here...
}
于 2013-02-11T21:54:18.707 に答える
2

申し訳ありませんが、それは不可能です。

new Future.immediate(value)関数が戻り、おそらく値を取得できる場合がいくつかありますが、次のとおりです。

  1. これはそれらのケースの 1 つではありません。プロセスは、VM によって完全に非同期で実行されます。
  2. Future の値に直接アクセスする機能は、libv2 アップデートで削除されました。

これを処理する方法は、フューチャーを返す関数をProcess.run()使用し、コールバックですべてのロジックを実行することです。これはご存知のようです。したがって、ここでのコードは単なる例であり、実際には行っていないと想定しています。これでmain()。その場合、残念ながら、基本的に運が悪いです。将来の値を知ることに依存している場合、または操作が完了している場合は、関数を非同期にする必要があります。

Dart や Javascript などのシングル スレッド環境での非同期はバイラルであり、常にコール スタックを伝播します。この関数を呼び出すすべての関数、およびそれらを呼び出すすべての関数などは、非同期である必要があります。

于 2013-02-11T21:24:48.443 に答える
0

いいえ。

非同期操作が終了すると、コードが結果をコールバックとして受け取るという acync API の要点。

コードを記述する別の方法として、ネストを減らしたい場合は、関数をthen()

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

void doSomethingWithResult(result) {
   print(result.stdout); // I have the output here...
}
于 2013-02-11T21:29:33.593 に答える