You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中发起多个独立服务器请求的最优实现方式

优化Dart多API请求:并行执行的最优方案

嘿,你的串行请求写法确实会拖慢整体效率——每次都得等前一个请求完成才发下一个,总耗时是所有请求时间的累加。咱们直接上最优解:用Future.wait()来并行发起所有请求,这样所有API调用会同时启动,总耗时只取决于最慢的那个请求,效率提升非常明显。

核心思路

  1. 把每个ID对应的API请求+响应处理,转换成独立的Future<Item>异步任务
  2. 用Future.wait()批量等待所有异步任务完成,一次性拿到所有结果
  3. 复用同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:29:40