当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/353019.html

相关文章:

  • Cisco ASA防火墙抓包命令Capture
  • Linux网络编程:HTTP协议
  • HTTP 协议中 GET 和 POST 有什么区别?分别适用于什么场景?
  • talib 安装
  • echarts-树图、关系图、桑基图、日历图
  • 04Django项目基本运行逻辑及模板资源套用
  • 安徽大学数学科学学院教授陈昌昊
  • com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现“$ref“:“$[0]“现象问题
  • 【C++】详解AVL树——平衡二叉搜索树
  • 《计算机网络微课堂》2-2 物理层下面的传输媒体
  • 【算法设计与分析】基于Go语言实现动态规划法解决TSP问题
  • Golang单元测试
  • mac下安装airflow
  • 二进制中1的个数c++
  • 【面试干货】数据库乐观锁,悲观锁的区别,怎么实现
  • 移动端仪表盘,支持更多组件
  • 科技产业园3D探秘:未来科技之城的奇幻之旅
  • 【Python搞定车载自动化测试】——Python基于Pytest框架实现UDS诊断自动化(含Python源码)
  • 探索SPI单线传输模式中时钟线与数据传输的简化
  • 使用FFmpeg推流实现在B站24小时点歌直播
  • 汽车防抱死制动系统ABS的单片机程序Proteus仿真设计
  • IOS开发者证书快捷申请
  • python 火焰检测
  • 栈——顺序存储
  • 军队仓库管理系统|DW-S301系统特点
  • MySQL和MongoDB数据库的区别
  • 类脑计算和量子计算、人工智能的关系
  • Qt5 互动地图,实现无人机地面站效果
  • 【文末附gpt升级方案】TikTok Symphony AI套件:智能视频制作的新篇章
  • 面试回答——有高并发、高性能、高可用系统架构设计实践以及性能调优经验