2016-05-31 5 views
1

を開始するように私はcallee()終了までcaller()待ち、このシナリオでは、2つの機能は、スレッド

callee() async { 
    // do something that takes some time 
} 

caller() async { 
    await callee(); 
} 

を有します。私はそれを望んでいない。 callee()を呼び出した直後にcaller()が完了します。 callee()は将来いつでも完了できますが、私は気にしません。私はちょうどスレッドのようにそれを開始し、それについて忘れてしまいたいです。

これは可能ですか?

答えて

3

あなたがcallee関数を呼び出すとき、それはFutureを返します。 awaitは、その未来が完了するのを待ちます。未来を待っていない場合は、とにかく終了しますが、あなたのcaller機能はそれを待ってブロックされません。だから、あなただけ行うことができます。

caller() { 
    callee(); // Ignore returned Future (at your own peril). 
} 

あなたがそれを行う場合、あなたはcalleeがエラーで失敗した場合に何が起こるかを知っておく必要があります。それにより、返された未来がそのエラーで完全になり、将来聞いていなければ、そのエラーは「キャッチされていない」とみなされます。キャッチされていないエラーは現在のZoneによって処理され、デフォルトの動作はトップレベルのキャッチされていないエラーのように振る舞います。

したがって、このエラーを処理することを忘れないでください。

calleeが失敗しない場合は、完了しました(とにかく失敗しない限り、それで楽しいデバッグができます)。

あなたがローカルでエラーを処理することができます

caller() { 
    callee().catchError((e, s) { 
    logErrorSomehow(e, s); 
    }); 
} 

か、エラー処理ゾーンをインストールし、その中にあなたのコードを実行することができた:

runZoned(() { 
    myProgram(); 
}, onError: logErrorSomehow); 

runZoned関数を参照してください、それはonErrorパラメータです。

1

確かに、awaitを省略してください。この方法でcallee()が直ちに呼び出され、非同期操作が呼び出されると、呼び出しは後で実行するためにイベントキューにスケジュールされ、その直後にcaller()が続行されます。

これはスレッドのようなものではありません。前述のように、処理はイベントキューにエンキューされます。つまり、現在のタスクとすべての以前にエンキューされたタスクが完了するまで実行されません。

本当の並列実行が必要な場合は、分離を利用する必要があります。

も参照してください