Dart中Future.wait回调带与不带内部async await的区别及选型
Dart 异步批量转换两种写法的差异对比
前置定义
我们先明确问题中给出的基础方法:
Future transformObject(T object);
两种待对比的写法如下:
写法一
Future transformData(Iterable<T> objects) async { await Future.wait(objects.map((o) => transformObject(o))); }
写法二
Future transformData(Iterable<T> objects) async { await Future.wait(objects.map((o) async { await transformObject(o); })); }
二者核心差异
- 逻辑包装差异:写法一的
map回调直接返回transformObject原生生成的Future对象,没有额外冗余层。写法二额外套了一层匿名async函数,内部await执行完转换方法后,会再返回一个新的Future对象,相当于多了一层无意义的Future包装,会产生微小的不必要性能开销。 - 异常抛出时机差异:如果
transformObject执行时抛出同步异常,写法一的异常会在map遍历生成Future列表时同步抛出;写法二因为有async函数包裹,同步异常会被封装到匿名函数返回的Future中,直到await Future.wait时才会抛出。
选型建议
如果仅需要实现异步转换所有数据对象的需求,直接选用写法一:
- 代码简洁直观,没有冗余的嵌套逻辑
- 没有额外的
Future包装开销,执行效率更高
写法二仅适合需要在单个转换回调中做额外处理的场景,比如单独捕获单个转换任务的异常、对单个返回值做额外处理等,纯批量等待场景不需要多套一层 async/await。
内容的提问来源于stack exchange,提问作者csstudent1418
相关产品推荐
相关产品推荐

