Hướng dẫn Sử dụng then()
và whenComplete()
trong Dart
Khi làm việc với Future
trong Dart, bạn sẽ thường xuyên gặp hai phương thức quan trọng: then()
và whenComplete()
. Cả hai phương thức này đều giúp bạn xử lý kết quả của một tác vụ bất đồng bộ, nhưng chúng phục vụ các mục đích khác nhau. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng chúng và sự khác biệt giữa chúng.
Phương thức then()
Phương thức then()
được sử dụng để đăng ký một callback sẽ được gọi khi Future
hoàn thành thành công. Đây là cách để xử lý giá trị trả về từ một tác vụ bất đồng bộ.
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () => "Data fetched");
}
void main() {
fetchData().then((data) {
print("Fetched: $data"); // Được gọi khi Future thành công
}).catchError((error) {
print("Error: $error"); // Được gọi khi Future thất bại
});
}
Trong ví dụ trên, khi fetchData()
hoàn thành thành công sau 2 giây, callback bên trong then()
sẽ được gọi, và chúng ta sẽ thấy thông báo “Fetched: Data fetched” trên console. Nếu có lỗi xảy ra, callback trong catchError()
sẽ xử lý lỗi đó.
Phương thức whenComplete()
Phương thức whenComplete()
cho phép bạn đăng ký một callback sẽ được gọi khi Future
hoàn thành, bất kể nó có thành công hay không. Điều này rất hữu ích khi bạn cần thực hiện một số hành động sau khi tác vụ hoàn thành, chẳng hạn như dọn dẹp tài nguyên hoặc cập nhật trạng thái.
void main() {
fetchData().then((data) {
print("Fetched: $data");
}).catchError((error) {
print("Error: $error");
}).whenComplete(() {
print("Fetch operation completed."); // Được gọi sau khi Future hoàn thành
});
}
Trong ví dụ này, sau khi giá trị được lấy hoặc nếu có lỗi xảy ra, callback trong whenComplete()
sẽ được gọi và chúng ta sẽ thấy thông báo “Fetch operation completed.” trên console.
Sự khác biệt chính
- Khi nào được gọi:
then()
chỉ được gọi khi Future
thành công.
whenComplete()
được gọi bất kể Future
có thành công hay thất bại.
- Trả về giá trị:
then()
trả về một Future
mới chứa kết quả từ callback.
whenComplete()
không trả về giá trị mới và không thay đổi kết quả của Future
ban đầu.
Kết luận
Việc sử dụng then()
và whenComplete()
giúp bạn xử lý các tác vụ bất đồng bộ một cách hiệu quả trong Dart. Hãy sử dụng then()
khi bạn cần xử lý giá trị trả về và whenComplete()
khi bạn muốn thực hiện một hành động nào đó sau khi tác vụ đã hoàn thành, không quan tâm đến kết quả.