Flutter tutorial – 2.9 Lập trình bất đồng bộ trong ngôn ngữ Dart với Future, async, await, then
Chào các bạn, trong nhiều ngôn ngữ các bạn đã quen với khái niệm lập trình bất đồng bộ (asynchronous programming) rồi đúng không ? Nhưng trong bài viết này Báo Flutter xin gửi đến các bạn một cách chi tiết về lập trình bất đồng bộ trong ngôn ngữ dart với các từ khoá như: Future, async, await.
Lập trình bất đồng bộ là gì ?
Lập trình bất đồng bộ là hoạt động cho phép chương trình thực hiện tiếp các công việc mà trong khi chờ các công việc khác vẫn đang trong qúa trình hoàn thành.
Lập trình bất đồng bộ dùng khi nào ?
Lập trình bất đồng bộ dùng khi :
+ Lấy dữ liệu từ Server, Firestore
+ Ghi, update vào database
+ Đọc nội dung từ file
Các từ khoá dùng trong lập trình bất đồng bộ : Future, async, await.
Dưới đây là một ví dụ khi lấy dữ liệu từ Server :
1 2 3 4 5 6 7 8 9 10 |
Future<MovieDetailModel> fetchMovieDetail(int movieId) async { final response = await client.get("$_baseUrl/$movieId/videos?api_key=$_apiKey"); if (response.statusCode == 200) { return MovieDetailModel.fromJson(json.decode(response.body)); } else { throw Exception('Lỗi khi load'); } } |
Không dùng lập trình bất đồng bộ thì sao ?
Nếu không dùng bất đồng bộ thì sảy ra trường hợp : dữ liệu nhận về bị lỗi. Ví dụ dưới đây là rõ nhất :
Khái niệm Future
Future là kết quả trả về của hoạt động bất đồng bộ. Future có hai trạng thái là : hoàn thành và chưa hoàn thành.
Future hoàn thành : Khi hoạt động bất đồng bộ thực hiện xong, lúc đó future ở trạng thái hoàn thành và trả về một giá trị hoặc một lỗi.
Ví dụ :
1 2 |
Future <T> // trả về giá trị kiểu T; Future <String> // trả về một chuỗi String |
Khi hoạt động bất đồng bộ thất bại thì Future ở trạng thái hoàn thành và trả về lỗi.
Future chưa hoàn thành: Khi hoạt động đồng bộ được gọi nó sẽ trả về một Future chưa hoàn thành.
Cách triển khai lập trình bất đồng bộ với Future, async, await
Dựa vào ví dụ dưới đây bạn có thể hiểu được cách dùng : Future , await, async :
1 2 3 |
Future<MovieModel> getMovieData () async { var movie = await loadMovies(); } |
+ Future : dùng cho kiểu dữ liệu trả về.
+ async : được đặt trước khối chứa await, nó đánh dấu là bất đồng bộ.
+ await : được đặt bên trong async và đặt ở trước các phương thức thực hiện việc load dữ liệu, hay ghi, update vào database..
1 2 3 4 5 |
RaisedButton( onPressed: () async { var data = await loadData(); } ) |
Lập trình bất đồng bộ sử dụng .then
Có một kiểu biểu diễn lập trình bất đồng bộ mà có thể xử lý lỗi và exception rất tiện lợi đó là sử dụng cú pháp chứa “then”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Lập trình bất đồng bộ và xử lý lỗi firstAction().then((value){ //seconsAction }) .catchError((error){ // xử lý lỗi }); // Lập trình bất đồng bộ và xử lý lỗi cụ thể firstAction().then((value){ //seconsAction }, onError(error){ // xử lý lỗi }); |
Kết luận : Như vậy bạn đã hiểu lập trình bất đồng bộ là gì và nó sử dụng để làm gì.
Khi thực hiện thao tác lấy, ghi, đọc, update dữ liệu từ File, Server, Firebase, Firestore, bạn nên dùng lập trình bất đồng bộ.
Về việc xử lý lỗi trong bất đồng bộ, bạn có thể đọc thêm ở đây.
Chúc các bạn có thêm được nhiều kiến thức từ blog của Báo Flutter!