Async/Await trong Dart
1. Giới thiệu
Dart sử dụng async và await để xử lý bất đồng bộ, tương tự JavaScript:
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return "Data loaded";
}
void main() async {
print("Loading...");
var data = await fetchData();
print(data); // Data loaded (sau 2 giây)
}2. Future
Future đại diện cho giá trị sẽ có trong tương lai:
Future<int> calculateSum() {
return Future.delayed(
Duration(seconds: 1),
() => 10 + 20
);
}
void main() async {
var sum = await calculateSum();
print(sum); // 30 (sau 1 giây)
}3. Async Function
Hàm async luôn trả về Future:
Future<String> greet() async {
return "Hello";
}
// Tương đương với:
Future<String> greet() {
return Future.value("Hello");
}4. Await
await chỉ dùng trong async function:
void loadData() async {
print("Start loading");
var data = await fetchData(); // Đợi kết quả
print("Data: $data");
}5. Error Handling
Future<String> fetchData() async {
throw Exception("Network error");
}
void main() async {
try {
var data = await fetchData();
print(data);
} catch (e) {
print("Error: $e");
}
}6. Multiple Futures
6.1. Sequential
void loadSequential() async {
var data1 = await fetchData1(); // Đợi
var data2 = await fetchData2(); // Đợi
print("$data1, $data2");
}6.2. Parallel
void loadParallel() async {
var results = await Future.wait([
fetchData1(),
fetchData2(),
]);
print(results);
}7. then() và catchError()
fetchData()
.then((data) => print("Success: $data"))
.catchError((error) => print("Error: $error"));8. Ví dụ thực tế
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<Map<String, dynamic>> fetchUser(int id) async {
final response = await http.get(
Uri.parse('https://api.example.com/users/$id')
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to load user');
}
}
void main() async {
try {
var user = await fetchUser(1);
print("User: ${user['name']}");
} catch (e) {
print("Error: $e");
}
}9. So sánh với Kotlin
| Dart | Kotlin | Ghi chú |
|---|---|---|
Future | suspend fun | Async function |
async | suspend | Keyword |
await | await | Wait for result |
Future.wait() | async { } | Parallel execution |
📝 Tóm tắt
Future- Giá trị bất đồng bộasync- Đánh dấu hàm bất đồng bộawait- Đợi kết quảtry-catch- Error handlingFuture.wait()- Chạy song songthen(),catchError()- Callback style
Last updated on