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

Dart/Flutter中FutureIterable.wait扩展未按预期抛出ParallelWaitError

问题分析与解决

你遇到的核心问题是没有正确使用package:async提供的FutureIterable.wait扩展及错误处理机制,以下是具体原因和修复步骤:

1. 必须导入正确的包

FutureIterable<T>.wait扩展和ParallelWaitError并非Dart SDK核心库自带,它们来自package:async。如果未导入该包,要么代码无法运行,要么你调用的是其他自定义实现,自然不会产生ParallelWaitError。

正确导入:

import 'package:async/async.dart';

2. 错误捕获需指定ParallelWaitError

如果你的try-catch块没有专门捕获ParallelWaitError,而是捕获了通用的Exception或Object,会直接拿到future抛出的原始错误(比如你遇到的String类型错误),无法触发ParallelWaitError的封装逻辑。

正确捕获方式:

try {
  final results = await yourFutureIterable.wait();
  // 处理成功结果
} on ParallelWaitError catch (e) {
  // 拿到所有错误和成功结果
  print("发生的错误列表: ${e.errors}");
  print("已完成的成功结果: ${e.results}");
}

3. 确保调用的是扩展方法而非静态方法

不要混淆Future.wait静态方法和FutureIterable.wait扩展方法:

  • Future.wait会在第一个错误抛出时立即终止并返回该错误
  • FutureIterable.wait会等待所有future完成,然后将所有错误和成功结果封装到ParallelWaitError中

错误写法(用了静态方法):

await Future.wait(futures); // 第一个错误直接抛出,无ParallelWaitError

正确写法(用扩展方法):

await futures.wait(); // 等待全部完成,返回ParallelWaitError

示例完整代码

import 'package:async/async.dart';

void main() async {
  final futures = [
    Future.delayed(Duration(milliseconds: 100), () => "结果1"),
    Future.delayed(Duration(milliseconds: 50), () => throw "错误1"),
    Future.delayed(Duration(milliseconds: 150), () => "结果2"),
    Future.delayed(Duration(milliseconds: 200), () => throw "错误2"),
  ];

  try {
    final results = await futures.wait();
    print("全部成功: $results");
  } on ParallelWaitError catch (e) {
    print("捕获到并行错误:");
    print("错误数量: ${e.errors.length}");
    print("错误内容: ${e.errors}");
    print("成功结果数量: ${e.results.length}");
    print("成功内容: ${e.results}");
  }
}

运行这段代码会输出:

捕获到并行错误:
错误数量: 2
错误内容: [错误1, 错误2]
成功结果数量: 2
成功内容: [结果1, 结果2]

内容的提问来源于stack exchange,提问作者Fractale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:04