设计思路
- 请求调度:使用一个队列来存储待执行的网络请求,按照一定规则从队列中取出请求并执行。
- 优先级处理:为每个请求分配一个优先级,在从队列中取出请求时,优先取出优先级高的请求。
- 依赖关系处理:对于有依赖关系的请求,在其依赖的请求完成后,将其加入队列。
数据结构
- Request类:用于表示一个网络请求,包含请求的唯一标识、优先级、请求方法、依赖的请求标识等信息。
- RequestQueue类:用于管理请求队列,包含一个存储请求的队列,以及添加请求、取出请求等方法。
核心实现代码
class Request {
final String id;
final int priority;
final Future Function() requestFunction;
final List<String>? dependencies;
Request({
required this.id,
required this.priority,
required this.requestFunction,
this.dependencies,
});
}
class RequestQueue {
final List<Request> _queue = [];
final Map<String, Future> _completedRequests = {};
void addRequest(Request request) {
if (request.dependencies == null ||
request.dependencies!.every((dependency) => _completedRequests.containsKey(dependency))) {
_queue.add(request);
_queue.sort((a, b) => b.priority - a.priority);
} else {
// 如果有依赖未完成,暂不加入队列
}
}
Future<dynamic> executeNext() async {
if (_queue.isEmpty) return null;
final request = _queue.removeAt(0);
final result = await request.requestFunction();
_completedRequests[request.id] = Future.value(result);
return result;
}
}
使用示例
void main() async {
final queue = RequestQueue();
Future<String> productDetailRequest() => Future.delayed(const Duration(seconds: 1), () => 'Product Detail');
Future<String> userInfoRequest() => Future.delayed(const Duration(seconds: 2), () => 'User Info');
Future<String> orderStatusUpdateRequest() => Future.delayed(const Duration(seconds: 3), () => 'Order Status Updated');
final productRequest = Request(
id: 'product',
priority: 2,
requestFunction: productDetailRequest,
);
final userRequest = Request(
id: 'user',
priority: 1,
requestFunction: userInfoRequest,
);
final orderRequest = Request(
id: 'order',
priority: 3,
requestFunction: orderStatusUpdateRequest,
dependencies: ['product', 'user'],
);
queue.addRequest(productRequest);
queue.addRequest(userRequest);
queue.addRequest(orderRequest);
while (true) {
final result = await queue.executeNext();
if (result == null) break;
print(result);
}
}