架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 1661|回复: 2

[其他] RxJS 关于 firstValueFrom 和 lastValueFrom 的区别

[复制链接]
发表于 2024-8-6 11:19:02 | 显示全部楼层 |阅读模式
需求:项目中需要将  Observables 转换成 Promises 等待完成,在 Angular 项目中使用 toPromise() 方法的时候,提示已经弃用,然后,建议使用 firstValueFrom 或 lastValueFrom 静态方法。

QQ截图20240806111333.jpg

为什么弃用 toPromise() 方法?

因为 toPromise() 方法名称从未表明 Promise 将解析哪个发出的值,因为 Observables 可以随时间产生多个值。转换为 Promise 时,您可能希望选择要选择第一个到达的值或最后一个值。为了解决所有这些问题,我们决定弃用 toPromise(),并引入两个用于转换为 Promises 的新辅助函数。

简单理解就是 Observables 会产生多个值,然后 Promises 最终结果又只会是一个值,然后,有的用户想用第一个值,有的用户想用最后一个值,所以,就出现了 firstValueFrom 和 lastValueFrom。(备注:toPromise() 是获取 Observables 的最后一个值

firstValueFrom 示例

您可能希望在第一个值到达时获取它,而无需等待Observable完成,因此您可以使用firstValueFrom。firstValueFrom将使用Observable发出的第一个值解析Promise,并立即取消订阅以保留资源。如果Observable完成时没有发出任何值,则firstValueFrom也将以EmptyError拒绝。

QQ截图20240806111211.jpg

lastValueFrom 示例

lastValueFrom 几乎与 toPromise() 完全相同,这意味着它将使用 Observable 完成时到达的最后一个值进行解析,但在 Observable 完成而不发出单个值时,行为会有所不同。当 Observable 完成而没有发射时,toPromise() 将成功解析为 undefined(因此返回类型发生了变化),而 lastValueFrom 将拒绝为 EmptyError。因此,lastValueFrom 的返回类型是Promise<T>,就像 RxJS 6中的 toPromise() 一样。



QQ截图20240806111540.jpg

示例解析

在 RxJS 中,interval(1000) 生成了一个 Observable,该 Observable 会每隔 1000 毫秒(即 1 秒)发射一个递增的数字序列,从 0 开始。

接下来,.pipe(take(10)) 是一个操作符链,它限制了 Observable 发射的元素数量。在这里,take(10) 表示只取前 10 个发射的值。

让我们详细解释一下这个表达式:

interval(1000):创建一个 Observable,它每隔 1 秒发射一个数字。数字序列从 0 开始,每次增加 1。

.pipe(take(10)):使用 .pipe() 方法连接多个操作符。这里我们使用了 take(10) 操作符,它限制了 Observable 只发射前 10 个值。

测试 EmptyError 错误

代码如下:


或者


QQ截图20240806111749.jpg

参考:https://rxjs.dev/deprecations/to-promise




上一篇:【实战】MySQL 命令行查询结果返回 ?问号
下一篇:Angular 18 系列(二十二)引入 FontAwesome 图标库
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-8-6 11:21:09 | 显示全部楼层
如果是在 Angular HTTP 中使用 lastValueFrom 或 firstValueFrom 是等价的,没有区别,也就是用哪个都可以。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-10-16 21:44:52 | 显示全部楼层
如果返回 of() 则可能出现 no elements in sequence 异常,lastValueFrom现在将配置参数作为其第二个参数,并且您可以指定当可观察对象为空时发出的默认值:

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-2-16 07:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表