MST

星途 面试题库

面试题:Flutter Future请求队列在复杂业务场景下的设计

在一个Flutter电商应用中,存在多种类型的网络请求,如商品详情请求、用户信息请求、订单状态更新请求等,不同类型请求优先级不同,且有些请求依赖其他请求的结果。请设计一个基于Future的网络请求队列方案,满足复杂业务场景下的请求调度、优先级处理及依赖关系处理,并详细说明设计思路、数据结构及核心实现代码。
29.3万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 请求调度:使用一个队列来存储待执行的网络请求,按照一定规则从队列中取出请求并执行。
  2. 优先级处理:为每个请求分配一个优先级,在从队列中取出请求时,优先取出优先级高的请求。
  3. 依赖关系处理:对于有依赖关系的请求,在其依赖的请求完成后,将其加入队列。

数据结构

  1. Request类:用于表示一个网络请求,包含请求的唯一标识、优先级、请求方法、依赖的请求标识等信息。
  2. 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);
  }
}