非同期サポート
Dartライブラリには、Future
またはStream
オブジェクトを返す関数が多数含まれています。これらの関数は*非同期*です。つまり、時間のかかる可能性のある操作(I/Oなど)の設定後、その操作が完了するのを待たずに返ります。
async
およびawait
キーワードは非同期プログラミングをサポートしており、同期コードとよく似た非同期コードを記述できます。
Futureの処理
#完了したFutureの結果が必要な場合は、2つの選択肢があります。
- ここで説明されているとおり、および非同期プログラミングチュートリアルで説明されているように、
async
とawait
を使用します。 dart:async
ドキュメントで説明されているように、Future APIを使用します。
async
とawait
を使用するコードは非同期ですが、同期コードによく似ています。たとえば、await
を使用して非同期関数の結果を待機するコードを次に示します。
await lookUpVersion();
await
を使用するには、コードはasync
関数(async
とマークされた関数)内になければなりません。
Future<void> checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
await
を使用するコードでは、try
、catch
、finally
を使用してエラー処理とクリーンアップを行います。
try {
version = await lookUpVersion();
} catch (e) {
// React to inability to look up the version
}
async
関数ではawait
を複数回使用できます。たとえば、次のコードは関数の結果を3回待機します。
var entrypoint = await findEntryPoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
await 式
では、式
の値は通常Futureです。そうでない場合、値は自動的にFutureにラップされます。このFutureオブジェクトは、オブジェクトを返すことを約束を示します。await 式
の値はその返されたオブジェクトです。await式により、そのオブジェクトが利用可能になるまで実行が一時停止します。
await
を使用するときにコンパイル時エラーが発生する場合は、await
がasync
関数内にあることを確認してください。 たとえば、アプリのmain()
関数でawait
を使用するには、main()
の本体をasync
としてマークする必要があります。
void main() async {
checkVersion();
print('In main: version is ${await lookUpVersion()}');
}
Future、async
、await
の使用に関するインタラクティブな入門については、非同期プログラミングチュートリアルを参照してください。
非同期関数の宣言
#async
関数は、その本体がasync
修飾子でマークされている関数です。
関数にasync
キーワードを追加すると、Futureが返されるようになります。たとえば、Stringを返す同期関数を次に示します。
String lookUpVersion() => '1.0.0';
将来の実装に時間がかかるため、これをasync
関数に変更すると、返される値はFutureになります。
Future<String> lookUpVersion() async => '1.0.0';
関数の本体でFuture APIを使用する必要はありません。Dartは必要に応じてFutureオブジェクトを作成します。関数が役に立つ値を返さない場合は、その戻り型をFuture<void>
にします。
Future、async
、await
の使用に関するインタラクティブな入門については、非同期プログラミングチュートリアルを参照してください。
Streamの処理
#Streamから値を取得する必要がある場合は、2つの選択肢があります。
async
と*非同期forループ*(await for
)を使用します。dart:async
ドキュメントで説明されているように、Stream APIを使用します。
非同期forループは次の形式です。
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
式
の値はStream型である必要があります。実行は次のとおりです。
- ストリームが値を発行するまで待機します。
- 変数をその発行された値に設定して、forループの本体を実行します。
- ストリームが閉じられるまで1と2を繰り返します。
ストリームへのリスニングを停止するには、break
またはreturn
ステートメントを使用できます。これにより、forループから抜け出し、ストリームの購読が解除されます。
非同期forループを実装するときにコンパイル時エラーが発生する場合は、await for
がasync
関数内にあることを確認してください。 たとえば、アプリのmain()
関数で非同期forループを使用するには、main()
の本体をasync
としてマークする必要があります。
void main() async {
// ...
await for (final request in requestServer) {
handleRequest(request);
}
// ...
}
Dartの非同期プログラミングサポートの詳細については、dart:async
ライブラリドキュメントを参照してください。
特に明記されていない限り、このサイトのドキュメントはDart 3.5.3を反映しています。ページの最終更新日は2024年6月10日です。ソースコードを表示 または 問題を報告する。