Dart中发起多个独立服务器请求的最优实现方式
优化Dart多API请求:并行执行的最优方案
嘿,你的串行请求写法确实会拖慢整体效率——每次都得等前一个请求完成才发下一个,总耗时是所有请求时间的累加。咱们直接上最优解:用Future.wait()来并行发起所有请求,这样所有API调用会同时启动,总耗时只取决于最慢的那个请求,效率提升非常明显。
核心思路
- 把每个ID对应的API请求+响应处理,转换成独立的
Future<Item>异步任务 - 用
Future.wait()批量等待所有异步任务完成,一次性拿到所有结果 - 复用同一个
http.Client(这很重要,避免频繁创建销毁连接)
完整优化代码
import 'dart:convert'; import 'package:http/http.dart' as http; Future<List<Item>> getAllItems() async { final client = http.Client(); final itemIds = ['1', '2', '3']; // 为每个ID创建独立的异步任务:请求API并解析为Item final requestFutures = itemIds.map((itemId) async { // 用Uri.parse避免字符串拼接的URL格式问题 final response = await client.get(Uri.parse('sampleapi/$itemId/next')); // 这里替换成你的实际响应处理逻辑 final itemJson = jsonDecode(response.body); return Item.fromJson(itemJson); // 假设你有Item.fromJson的构造方法 }).toList(); // 等待所有并行请求完成,获取结果列表 final itemList = await Future.wait(requestFutures); client.close(); return itemList; } // 示例Item类(根据你的实际结构调整) class Item { final String id; // 其他字段... Item({required this.id}); factory Item.fromJson(Map<String, dynamic> json) { return Item(id: json['id']); } }
额外优化:处理部分请求失败的场景
默认情况下,如果某个请求失败,Future.wait()会立即抛出错误,导致整个方法失败。如果你想允许部分请求失败,保留成功的结果,可以给每个任务添加错误捕获:
final requestFutures = itemIds.map((itemId) async { try { final response = await client.get(Uri.parse('sampleapi/$itemId/next')); final itemJson = jsonDecode(response.body); return Item.fromJson(itemJson); } catch (e) { // 打印错误日志,或者做其他处理 print('Failed to fetch item $itemId: $e'); return null; // 返回null标记失败的请求 } }).toList(); // 过滤掉null结果,只保留成功获取的Item final itemList = (await Future.wait(requestFutures)) .whereType<Item>() // 筛选非null的Item .toList();
为什么这是最优方案?
- 性能最大化:并行请求把总耗时从「请求时间之和」降到「最长单个请求时间」
- 资源高效:复用同一个
http.Client,避免重复创建HTTP连接池,减少资源开销 - 代码简洁:用
map+Future.wait()的组合,比手动管理多个Future要清晰易读
内容的提问来源于stack exchange,提问作者Sabith
相关产品推荐
相关产品推荐

