1. 非同期プログラミングとは
非同期プログラミングは、時間のかかる操作(例えば、ネットワークリクエストやファイルの読み書き)を実行している間に他の処理をブロックせずに続行するための手法です。これにより、アプリケーションのパフォーマンスが向上し、応答性が良くなります。
2. Futureとは
Futureは、非同期操作の結果を表すオブジェクトです。将来の時点で値が提供されるか、エラーが発生する可能性があります。Futureは、現在は値が利用できないが、将来的には利用可能になることを示します。
Futureの基本的な使用方法
Dart
Future<String> fetchUserOrder() {
// 2秒後に結果を返す非同期関数
return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}
void main() {
print('Fetching user order...');
fetchUserOrder().then((order) {
print('Order: $order');
});
print('Done');
}
重要なポイント
Future.delayed
は、指定された時間後に結果を返すFutureを作成します。then
メソッドを使用して、Futureの結果が利用可能になったときに実行されるコールバックを設定します。
3. asyncとawait
async
とawait
は、非同期コードをより直感的に書くための構文です。async
関数はFutureを返し、await
キーワードを使用することで、Futureの完了を待つことができます。
asyncとawaitの基本的な使用方法
Dart
Future<String> fetchUserOrder() {
// 2秒後に結果を返す非同期関数
return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}
Future<void> printOrderMessage() async {
print('Fetching user order...');
var order = await fetchUserOrder();
print('Order: $order');
}
void main() {
printOrderMessage();
print('Done');
}
重要なポイント
async
関数は、Futureを返す関数として定義されます。await
キーワードを使用して、Futureの完了を待ちます。この間、他の処理はブロックされません。
4. エラーハンドリング
非同期操作中にエラーが発生することがあります。Futureのエラーハンドリングは、catchError
メソッドやtry-catch
ブロックを使用して行います。
catchErrorメソッドを使用したエラーハンドリング
Dart
Future<String> fetchUserOrder() {
return Future.delayed(Duration(seconds: 2), () => throw Exception('Out of milk'));
}
void main() {
fetchUserOrder().then((order) {
print('Order: $order');
}).catchError((error) {
print('Error: $error');
});
}
try-catchブロックを使用したエラーハンドリング
Dart
Future<String> fetchUserOrder() {
return Future.delayed(Duration(seconds: 2), () => throw Exception('Out of milk'));
}
Future<void> printOrderMessage() async {
try {
print('Fetching user order...');
var order = await fetchUserOrder();
print('Order: $order');
} catch (error) {
print('Error: $error');
}
}
void main() {
printOrderMessage();
print('Done');
}
5. 複数の非同期操作の待機
複数の非同期操作を同時に待機するためには、Future.wait
を使用します。
Future.waitの使用例
Dart
Future<String> fetchUserOrder() {
return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}
Future<String> fetchUserDetails() {
return Future.delayed(Duration(seconds: 1), () => 'User: John Doe');
}
Future<void> printUserDetailsAndOrder() async {
var results = await Future.wait([fetchUserOrder(), fetchUserDetails()]);
print('Order: ${results[0]}');
print('Details: ${results[1]}');
}
void main() {
printUserDetailsAndOrder();
print('Fetching data...');
}
6. 例題
例題1: 基本的な非同期操作
Dart
Future<void> fetchData() async {
print('Starting to fetch data...');
await Future.delayed(Duration(seconds: 3));
print('Data fetched!');
}
void main() {
fetchData();
print('Doing other work...');
}
例題2: 非同期関数のエラーハンドリング
Dart
Future<void> fetchData() async {
try {
print('Starting to fetch data...');
await Future.delayed(Duration(seconds: 3), () => throw Exception('Fetch failed'));
print('Data fetched!');
} catch (e) {
print('Error: $e');
}
}
void main() {
fetchData();
print('Doing other work...');
}
例題3: 複数の非同期操作の待機
Dart
Future<void> fetchData1() async {
print('Fetching data 1...');
await Future.delayed(Duration(seconds: 2));
print('Data 1 fetched!');
}
Future<void> fetchData2() async {
print('Fetching data 2...');
await Future.delayed(Duration(seconds: 1));
print('Data 2 fetched!');
}
Future<void> fetchAllData() async {
await Future.wait([fetchData1(), fetchData2()]);
print('All data fetched!');
}
void main() {
fetchAllData();
print('Doing other work...');
}
↓次回内容:
1. Streamとは
Streamは、非同期データの連続的な流れを処理するためのオブジェクトです。Streamを使用すると、イベントやデータの連続的なシーケンスを非同期で処理できます。Dartでは、Stream
クラスを使用してストリームを表現します。
Streamの基本的な使用方法
Streamは、リスナーを登録することでデータの受信を開始します。リスナーは、データがストリームに到達すると呼び出されます。