Menu
CoddyTech

Ôn tập: Trình lấy dữ liệu

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 81 trên 110.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp DataFetcher kết hợp tất cả các khái niệm OOP bất đồng bộ trong chương này! Bạn sẽ tạo một dịch vụ dữ liệu dùng quá trình khởi tạo bất đồng bộ, các phương thức bất đồng bộ để lấy từng mục riêng lẻ và một luồng để gửi nhiều kết quả theo thời gian.

Bạn sẽ sắp xếp code vào hai tệp:

  • data_fetcher.dart: Tạo một lớp DataFetcher mô phỏng việc lấy dữ liệu từ một nguồn từ xa. Lớp của bạn cần có:
    • Một trường String final tên là source, lưu nơi dữ liệu đến từ đó
    • Một hàm khởi tạo riêng để khởi tạo nguồn
    • Một hàm factory bất đồng bộ tĩnh connect(String sourceName) trả về một Future<DataFetcher>. Mô phỏng độ trễ kết nối 100 mili giây, sau đó trả về một instance mới có nguồn được đặt thành tên đã cung cấp
    • Một phương thức bất đồng bộ fetchItem(int id) trả về một Future<String>. Mô phỏng độ trễ 50 mili giây, sau đó trả về một chuỗi theo định dạng: [source]-Item-[id]
    • Một phương thức tạo luồng fetchMultiple(int count) trả về một Stream<String>. Phương thức này cần yield các mục có ID từ 1 đến count, bao gồm cả count, dùng phương thức fetchItem cho từng mục (await mỗi lần lấy dữ liệu trước khi yield)
  • main.dart: Import bộ lấy dữ liệu của bạn và minh họa cách cả ba mẫu bất đồng bộ phối hợp với nhau:
    • In ra Connecting to data source...
    • Dùng hàm factory bất đồng bộ để kết nối với nguồn có tên CloudDB
    • In ra Connected to [source] bằng trường source của bộ lấy dữ liệu
    • In ra một dòng trống
    • In ra Fetching single item:
    • Lấy và in ra mục có ID 42
    • In ra một dòng trống
    • In ra Fetching multiple items:
    • Dùng await for để lặp qua fetchMultiple(3) và in ra từng mục
    • In ra một dòng trống
    • In ra All operations complete!

Thử thách này kết hợp mẫu hàm factory bất đồng bộ tĩnh để khởi tạo, các phương thức bất đồng bộ thông thường cho từng thao tác riêng lẻ và async* cùng với yield để truyền nhiều kết quả theo luồng. Hãy chú ý cách phương thức luồng có thể gọi các phương thức bất đồng bộ khác bên trong!

Đầu ra dự kiến:

Connecting to data source...
Connected to CloudDB

Fetching single item:
CloudDB-Item-42

Fetching multiple items:
CloudDB-Item-1
CloudDB-Item-2
CloudDB-Item-3

All operations complete!

Tự làm thử

import 'data_fetcher.dart';

void main() async {
  // TODO: In ra 'Connecting to data source...'
  
  // TODO: Dùng factory bất đồng bộ để kết nối với nguồn có tên 'CloudDB'
  
  // TODO: Dùng trường source của fetcher để in ra 'Connected to [source]'
  
  // TODO: In ra một dòng trống
  
  // TODO: In ra 'Fetching single item:'
  
  // TODO: Lấy và in ra phần tử có ID 42
  
  // TODO: In ra một dòng trống
  
  // TODO: In ra 'Fetching multiple items:'
  
  // TODO: Dùng 'await for' để duyệt qua fetchMultiple(3) và in ra từng phần tử
  
  // TODO: In ra một dòng trống
  
  // TODO: In ra 'All operations complete!'
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online