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

Angular进阶之十:toPromise废弃原因及解决方案

背景

Rxjs从V7开始废弃了toPromise, V8中会删除它。

原因

1:toPromise()只返回一个值

toPromise()将 Observable 序列转换为符合 ES2015 标准的 Promise 。它使用 Observable 序列的最后一个值。

例:

import { Observable } from "rxjs";
……
myObservable = new Observable<string>((observer) => {observer.next('Hello');observer.next('World');observer.complete();
});

获取并打印结果,toPromise()后只获取了最后一个结果'World'

this.myObservable.toPromise().then((value: string) => {console.log(`toPromise: ${value}`);
});

2:Observable 可能不产生值或产生多个值

Observable 和 Promise 之间的相似之处在于,两者都可能随着时间的推移产生值,但不同之处在于,Observable 可能不产生值或产生多个值,而 Promise在成功解析时仅产生一个值。

例:增加代码如下

this.myObservable.subscribe((value: string) => {console.log(`observable: ${value}`);
});

Observable产生两个值

如果我们注释掉下面代码,Observable不产生值但Promise产生一个undefined值,

myObservable = new Observable<string>((observer) => {// observer.next('Hello');// observer.next('World');observer.complete();
});

因此,在V7 中,Observable 的 toPromise() 方法的返回类型已修复,以更好地反映 Observable 可以产生零值的事实。对于某些项目来说,这可能是一个重大变化,因为返回类型已从 Promise<T> 更改为 Promise<T | undefined>。

3:toPromise() 方法名不明确

toPromise() 方法名称从未指示 Promise 将解析为发出的哪个值,因为 Observable 可以随时间产生多个值。转换为 Promise 时,您可能希望选择要选择哪个值 - 第一个到达的值或最后一个值。为了解决所有这些问题,rxjs决定弃用 toPromise(),

解决方案

作为已弃用的 toPromise() 方法的替代,您应该使用两个内置静态转换函数 firstValueFrom 或 lastValueFrom。

1:lastValueFrom

lastValueFrom 几乎与 toPromise() 完全相同,这意味着它将在 Observable 完成时解析为到达的最后一个值。

例:增加代码

const lastValue = await lastValueFrom(this.myObservable);
console.log(`lastValueFrom: ${lastValue}`);

但当 Observable 完成而未发出值时,行为有所不同。当 Observable 完成而未发出时,toPromise() 将成功解析为 undefined(因此返回类型会发生变化),而 lastValueFrom 将拒绝并返回 EmptyError。因此,lastValueFrom 的返回类型是 Promise<T>,就像 RxJS 6 中的 toPromise() 一样。

例:

myObservable = new Observable<string>((observer) => {// observer.next('Hello');// observer.next('World');observer.complete();
});
this.myObservable.toPromise().then((value: string | undefined) => {console.log(`toPromise: ${value}`);
});
const lastValue = await lastValueFrom(this.myObservable);
console.log(`lastValueFrom: ${lastValue}`);

2:firstValueFrom

但是,您可能希望在第一个值到达时立即获取它,而不等待 Observable 完成,因此您可以使用 firstValueFrom。firstValueFrom 将使用 Observable 发出的第一个值解析 Promise,并立即取消订阅以保留资源。

例:增加代码

const firstValue = await firstValueFrom(this.myObservable);
console.log(`firstValueFrom: ${ firstValue}`);

如果 Observable 完成且未发出任何值,firstValueFrom 也会拒绝并出现 EmptyError。

例:

myObservable = new Observable<string>((observer) => {// observer.next('Hello');// observer.next('World');observer.complete();
});
this.myObservable.toPromise().then((value: string | undefined) => {console.log(`toPromise: ${value}`);
});
const firstValue = await firstValueFrom(this.myObservable);
console.log(`firstValueFrom: ${ firstValue}`);

默认值

无论是哪种替代方案,我们都可以设置默认值,以防止EmptyError发生。

例:

const firstValue = await firstValueFrom(this.myObservable, { defaultValue: "''" });
console.log(`firstValueFrom: ${ firstValue}`);
const lastValue = await lastValueFrom(this.myObservable, { defaultValue: "''" });
console.log(`lastValueFrom: ${lastValue}`);

最后

仅当您知道 Observable 最终会完成时才使用 lastValueFrom 函数。如果您知道 Observable 将发出至少一个值或最终会完成,则应使用 firstValueFrom 函数。

如果源 Observable 未完成或未发出,您最终会得到一个挂起的 Promise,并且异步函数的所有状态都可能挂在内存中。

为了避免这种情况,请考虑添加 timeouttaketakeWhiletakeUntil 等。

相关文章:

Angular进阶之十:toPromise废弃原因及解决方案

背景 Rxjs从V7开始废弃了toPromise, V8中会删除它。 原因 1&#xff1a;toPromise()只返回一个值 toPromise()将 Observable 序列转换为符合 ES2015 标准的 Promise 。它使用 Observable 序列的最后一个值。 例&#xff1a; import { Observable } from "rxjs"; ………...

python实现RSA算法

目录 一、算法简介二、算法描述2.1 密钥产生2.2 加密过程2.3 解密过程2.4 证明解密正确性 三、相关算法3.1 欧几里得算法3.2 扩展欧几里得算法3.3 模重复平方算法3.4 Miller-Rabin 素性检测算法 四、算法实现五、演示效果 一、算法简介 RSA算法是一种非对称加密算法&#xff0c…...

可灵开源视频生成数据集 学习笔记

目录 介绍 可灵团队提出了四个模块的改进&#xff1a; video caption 新指标 vtss 动态质量 静态质量 视频自然性 介绍 在视频数据处理中&#xff0c;建立准确且细致的条件是关键&#xff0c;可灵团队认为&#xff0c;解决这一问题需要关注三个主要方面&#xff1a; 文本…...

告别软文营销瓶颈!5招助你突破限制,实现宣传效果最大化

在当今信息爆炸的时代&#xff0c;软文营销作为品牌推广的重要手段之一&#xff0c;面临着日益激烈的竞争和受众日益提高的辨别力。传统的软文营销方式往往难以穿透消费者的心理防线&#xff0c;实现有效的信息传递和品牌塑造。为了突破这一瓶颈&#xff0c;实现宣传效果的最大…...

秋冬进补防肥胖:辨证施补,健康过冬不增脂

中医理论中的秋冬“封藏” 在中医理论中&#xff0c;认为秋冬季节是人体“封藏”的时期&#xff0c;而“封藏”指的是秋冬季节人体应当减少消耗&#xff0c;蓄积能源&#xff0c;此时进补可以使营养物质易于吸收并蓄积于体内&#xff0c;从而增强体质和抵抗力&#xff0c;为来…...

uniapp radio单选

<uni-data-checkbox v-model"selectedValue" :localdata"quTypeList" change"radioChange"/> //产品类型列表 const quTypeList [{ text: 漆面膜, value: 100, }, { text: 改色…...

通熟易懂地讲解GCC和Makefile

1. 嵌入式开发工具链&#xff1a;GCC GCC&#xff08;GNU Compiler Collection&#xff09;是一个强大且常用的编译器套件&#xff0c;支持多种编程语言&#xff0c;比如 C 和 C。在嵌入式开发中&#xff0c;GCC 可以帮助我们把人类可读的 C/C 代码编译成机器可以理解的二进制…...

Java Agent使用

文章目录 基本使用premain使用场景 agentmain 关于tools.jar https://docs.oracle.com/en/java/javase/20/docs/specs/jvmti.html com.sun的API&#xff0c;如果使用其他厂商的JVM&#xff0c;可能没有这个API了&#xff0c;比如Eclipse的J9 https://www.ibm.com/docs/en/sdk…...

selenium 点击元素报错element not interactable

描述说明&#xff1a; 我这里是获取一个span标签后并点击&#xff0c;用的元素自带的element.click()&#xff0c;报错示例代码如下&#xff1a; driver.find_element(By.XPATH,//span[id"my_span"]).click() # 或者 elementdriver.find_element(By.XPATH,//span[i…...

【大数据技术基础 | 实验七】HBase实验:部署HBase

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;验证Hadoop和ZooKeeper已启动&#xff08;二&#xff09;修改HBase配置文件&#xff08;三&#xff09;启动并验证HBase 六、实验结果七、实验心得 一、实验目的 掌握…...

Android进程保活,lmkd杀进程相关

lmk原理 Android进程回收之LowMemoryKiller原理 lmkd 更新进程oomAdj; 设备端进程被杀可能原因...

SDL 播放PCM

SDL2播放PCM使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图API&#xff08;Direct3D&#xff0c;OpenGL&#xff09;的封装&#xff0c;使用起来明显简单于直接调用底层API。 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2 函数调用步骤如下: [初始化]SDL_In…...

基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真。本系统包括PV模块&#xff0c;电池模块&#xff0c;电池控制器模块&#xff0c;MPPT模块&#xff0c;PWM模…...

深入解析Vue3:从入门到实战(详细版)

文章目录 前言一、Vue3简介官网地址主要特点 二、安装与创建Vue3项目使用Vue CLI创建项目使用Vite创建项目 三、Composition API详解Setup函数ref与Reactive生命周期钩子计算属性和监听器 四、新特性与优化响应式系统更好的TypeScript支持类型定义类型推断新组件全局API重构更好…...

Pr 视频效果:ASC CDL

视频效果/颜色校正/ASC CDL Color Correction/ASC CDL ASC CDL ASC CDL效果通过对红、绿、蓝三个原色通道的独立调整&#xff0c;实现对图像色彩的精确控制。在此基础上&#xff0c;还可用于调整处理后图像的整体饱和度。 ◆ ◆ ◆ 效果选项说明 斜率 Slope、偏移 Offset和功…...

C++ --- Socket套接字的使用

目录 一.什么是Socket套接字&#xff1f; 二.Socket的使用&#xff1a; 前置步骤&#xff1a; 为什么要加入 WSAStartup 和 WSACleanup &#xff1f; 1.创建Socket&#xff1a; 2.绑定Socket&#xff1a; 3.服务端监听连接请求&#xff1a; 4.服务端接受客户端连接&…...

MG协议转换器:制氢行业的数字桥梁

在新能源产业蓬勃发展的今天&#xff0c;制氢行业正迎来前所未有的发展机遇。作为清洁能源的重要组成部分&#xff0c;氢气的生产与利用不仅关乎环境保护&#xff0c;更是推动能源结构转型的关键一环。然而&#xff0c;在制氢行业的数字化转型进程中&#xff0c;数据的传输与处…...

人工智能技术的未来:变革生活与工作的潜力

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;我们已经见证了其在各行各业的巨大变革。无论是在医疗、商业还是日常生活中&#xff0c;AI都正在悄然改变着我们的工作方式和生活方式。未来&#xff0c;人工智能的应用前景广阔&#xff0c;它将继续深入我们…...

D60【python 接口自动化学习】- python基础之数据库

day60 数据库定义 学习日期&#xff1a;20241106 学习目标&#xff1a;MySQL数据库-- 128&#xff1a;数据库定义 学习笔记&#xff1a; 无处不在的数据库 数据库如何存储数据 数据库管理系统&#xff08;数据库软件&#xff09; 数据库和SQL的关系 总结 数据库就是指数据…...

零基础大龄程序员如何转型AI大模型,系统学习路径与资源推荐!!

前言 随着科技的飞速发展&#xff0c;AI大模型浪潮席卷全球&#xff0c;相关岗位炙手可热。在这个背景下&#xff0c;许多大龄程序员开始思考如何转型&#xff0c;以适应时代的变化。结合自身编程基础&#xff0c;大龄程序员可以学习机器学习、深度学习算法&#xff0c;投身于…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...