likes
comments
collection
share

告别 Dart 中的 Future.wait([])

作者站长头像
站长
· 阅读数 31

作为 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 中简化异步编程的乐趣。


原文:yongjhih.medium.com/say-goodbye…

转载自:https://juejin.cn/post/7372503361361068082
评论
请登录