告别 Dart 中的 Future.wait([])
作为 Dart 开发人员,我们对异步编程和 Futures 的强大功能并不陌生。过去,当我们需要同时等待多个 future
时,我们依赖 Future.wait([])
方法,该方法返回一个 List<T>
。然而,这种方法有一个显着的缺点:我们必须手动将结果转换为所需的类型,这可能会导致代码冗长且容易出错。
final results = await Future.wait([
Future.value("andrew"),
Future.value(1984),
]);
expect((results[0] as String).toUpperCase(), "ANDREW");
expect((results[1] as int).isNegative, false);
幸运的是,有一个更优雅的解决方案,它利用了扩展和 async/await 语法的强大功能: zipWith
扩展方法。
介绍 zipWith
zipWith 扩展方法允许您将两个 future
的结果组合成一个类型化元组,从而无需手动转换。它的工作原理如下:
final (name, year) = await Future.value("andrew")
.zipWith(Future.value(1984));
expect(name.toUpperCase(), "ANDREW");
expect(year.isNegative, false);
在此示例中,我们将合并两个 future
的结果:一个解析为字符串 “andrew”,另一个解析为整数 1984。该 zipWith
方法返回一个元组, (T, T2)
其中 T
是第一个未来的类型, T2
是第二个未来的类型。
但是等等,还有更多!您甚至可以链接多个 zipWith
调用来组合三个或更多 future
的结果:
final ((name, year), married) = await Future.value("andrew")
.zipWith(Future.value(1984))
.zipWith(Future.value(false));
// ...
expect(married, false);
在此示例中,我们将三个 futures 组合在一起,从而生成一个嵌套元组 ((T, T2), T3)
。
引擎盖下
那么,zipWith
是如何施展魔法的呢?下面是实现方法:
extension FutureZipX<T> on Future<T> {
Future<(T, T2)> zipWith<T2>(Future<T2> future2) async {
late T result1;
late T2 result2;
await Future.wait([
then((it) => result1 = it),
future2.then((it) => result2 = it)
]);
return (result1, result2);
}
}
结束语
通过利用 zipWith
的强大功能,您可以在处理多个异步操作时编写更简洁、更具表现力的代码。无需再手动转换或摆弄 List<dynamic>
- 只需简洁、类型安全的元组,使您的代码更易于阅读和维护。
因此,下次当您发现自己要兼顾多个 future
时,请尝试一下 zipWith
,体验 Dart 中简化异步编程的乐趣。
转载自:https://juejin.cn/post/7372503361361068082