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

LeetCode 2723. 两个 Promise 对象相加

给定两个 promise 对象 promise1 和 promise2,返回一个新的 promise。promise1 和 promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。

示例 1:

输入:
promise1 = new Promise(resolve => setTimeout(() => resolve(2), 20)),
promise2 = new Promise(resolve => setTimeout(() => resolve(5), 60))
输出:7
解释:两个输入的 Promise 分别解析为值 2 和 5。返回的 Promise 应该解析为 2 + 5 = 7。返回的 Promise 解析的时间不作为判断条件。

promise1 和 promise2 都是被解析为一个数字的 promise 对象

注:Promise是JavaScript中的内容,用于表示异步操作的最终完成(或失败)并允许我们在结果可用时处理这些操作。它们是以更有组织和结构的方式处理异步代码的一种方法。Promise有三种状态:挂起(pending)、已完成(fulfilled)或拒绝(rejected):
1.挂起:Promise的初始状态,表示异步操作仍在进行中,尚未完成。

2.已完成:Promise的状态,表示异步操作成功完成,意味着 promises的结果或值可用。

3.拒绝:Promise的状态,表示异步操作遇到错误或失败, promises的结果无法获得。Promise提供了像 .then() 和 .catch() 这样的方法来处理已解析的值或错误。

通常,使用Promise时会遇到async和await关键字,它们用于简化Promise的使用,使异步代码看起来更像同步代码:
1.async:用于定义异步函数,确保函数始终返回一个Promise。当在函数声明或函数表达式前使用async关键字时,它变成一个异步函数。请注意,从异步函数返回的非Promise对象会自动包装成Promise对象。

2.await:用于暂停异步函数的执行,直到Promise解析。它只能在异步函数内部使用。当在Promise之前使用await时,它等待Promise解析或拒绝。如果已解析,它继续执行下一行代码;如果等待的Promise被拒绝,将抛出异常。使用await允许您以更顺序且可读的方式编写异步代码,而无需使用.then()显式链接Promise。

当需要同时执行多个异步操作并等待它们全部完成,通常会使用Promise.all()方法。

Promise.all()方法用于同时处理多个Promise。它以一个Promise数组(或可迭代对象)作为输入,并返回一个新的Promise,在输入数组中的所有Promise都已解析时才会解析。

Promise.all()方法将等待所有Promise解决(无论是fulfilled还是rejected)。如果所有Promise都被解决,返回的Promise也会被解决,而输入Promise的已解析值将按照输入Promise的顺序作为数组可用。

请注意:Promise.all()不仅接受Promise作为输入,还可以接受只包含数字的数组,它将解析这些数字,例如:

await Promise.all([1, 2, Promise.resolve(3), Promise.resolve(4)]).then((value) => {console.log(value)
}, (error) => {console.log(error)
})

以上代码先用Promise.resolve创建了两个已经解决的Promise对象,分别包含值3和4;之后的Promise.all接受了一个包含多个Promise对象和普通值的数组,创建了一个新的Promise对象,新的Promise对象会在所有输入的Promise都解决(或其中一个拒绝)后解决,在这里,它包含了两个普通值(1和2)和两个已经解决的Promise(3和4);await关键字用于等待一个Promise解决,在这里,await等待Promise.all的解决;一旦Promise.all的所有Promise都被解决,.then()方法就会被调用,.then方法接受了两个回调函数作为参数,第一个回调函数是所有Promise被解决时调用的,它接受一个参数value,参数value是一个包含所有Promise解决值的数组;如果有任何一个Promise被拒绝,或者其中一个Promise抛出了异常,.then()的第二个参数,即错误处理的回调函数,就会被调用。

使用Promise.all()允许有效并行执行多个异步操作,并在它们全部可用后处理合并的结果。

例如,当应用程序需要同时从多个API获取数据时,可以使用Promise.all()来并行启动所有请求并等待所有响应。一旦所有Promise都被解决,应用程序可以处理合并数据。

法一:使用Promise.all创建一个新的Promise,该Promise在Promise1和Promise2都被解决后解决,使用Promise.all时,我们使用await等待Promise1和Promise2都被解决。一旦由Promise.all()返回的Promise被满足,promise1和promise2的已解析值将以数组的形式可用。使用解构赋值,分别将这些值分配给res1和res2变量,最后,我们返回res1和res2的和:

/*** @param {Promise} promise1* @param {Promise} promise2* @return {Promise}*/
var addTwoPromises = async function(promise1, promise2) {try{const [res1, res2] = await Promise.all([promise1, promise2]);return res1 + res2;}catch (error){console.error(error);throw error;    // 重新抛出错误以保持将错误传播给调用者的行为}
};/*** addTwoPromises(Promise.resolve(2), Promise.resolve(2))*   .then(console.log); // 4*/

此算法时间复杂度为O(max(promise1,promise2)),取决于解析时间较长的那个Promise;空间复杂度为O(1)。

法二:仅使用await分别等待Promise1和Promise2的解析,此方法比法一更慢,因为法一是并行同时等待Promise1和Promise2的执行,而本方法按顺序执行两个Promise,即一个执行完后再执行另一个:

/*** @param {Promise} promise1* @param {Promise} promise2* @return {Promise}*/
var addTwoPromises = async function(promise1, promise2) {try{return await promise1 + await promise2;}catch (error){console.error(error);throw error;    // 重新抛出错误以保持将错误传播给调用者的行为}
};/*** addTwoPromises(Promise.resolve(2), Promise.resolve(2))*   .then(console.log); // 4*/

此算法时间复杂度为O(promise1+promise2),两个Promise串行执行;空间复杂度为O(1)。

法三:使用Promise.then()方法链接Promise:

/*** @param {Promise} promise1* @param {Promise} promise2* @return {Promise}*/
var addTwoPromises = async function(promise1, promise2) {try{return promise1.then((value1) => promise2.then((value2) => value1 + value2));}catch (error){console.error(error);throw error;    // 重新抛出错误以保持将错误传播给调用者的行为}
};/*** addTwoPromises(Promise.resolve(2), Promise.resolve(2))*   .then(console.log); // 4*/

此算法时间复杂度为O(promise1+promise2),两个Promise串行执行;空间复杂度为O(1)。

法四:我们可以并行处理promise1和promise2的解决,并累积结果,即我们可以使用计数器来跟踪已解决的Promise数量,一旦所有Promise都已解决,它将使用累积的结果解决新的Promise:

/*** @param {Promise} promise1* @param {Promise} promise2* @return {Promise}*/
var addTwoPromises = async function(promise1, promise2) {return new Promise((resolve, reject) => {let count = 2;let res = 0;[promise1, promise2].forEach(async promise => {try{const subRes = await promise;res += subRes;--count;if (count == 0){resolve(res);}}catch (err){reject(err);}});});
};/*** addTwoPromises(Promise.resolve(2), Promise.resolve(2))*   .then(console.log); // 4*/

以上代码创建了一个新Promise对象,并在其构造函数中执行了一个迭代,resolve和reject是Promise的构造函数提供的回调函数,用于控制Promise的状态,resolve的作用是将Promise的状态从待定(pending)变为已解决(fulfilled),reject的作用是将Promise的状态从待定(pending)变为已拒绝(rejected)。对于每个Promise,使用async等待其解决值,这个过程是并行的。此算法时间复杂度为O(max(promise1,promise2)),取决于解析时间较长的那个Promise;空间复杂度为O(1)。

相关文章:

LeetCode 2723. 两个 Promise 对象相加

给定两个 promise 对象 promise1 和 promise2,返回一个新的 promise。promise1 和 promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。 示例 1: 输入: promise1 new Promise(resolve > setTimeout(() > res…...

Flutter--常用技术文档

配置 清华大学flutter镜像 export PUB_HOSTED_URLhttps://mirrors.tuna.tsinghua.edu.cn/dart-pub export FLUTTER_STORAGE_BASE_URLhttps://mirrors.tuna.tsinghua.edu.cn/flutter 社区镜象 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_UR…...

行分类问题

行分类问题可以应用于多个领域和问题,其中一些示例包括: 文本分类: 在自然语言处理中,可以将文本分为不同的类别,例如情感分析、主题分类等。每个文本可以被视为一个“行”,而分类任务就是对每个行进行分类…...

java常见面试题:如何使用Java进行XML解析和生成?

在Java中,有几种不同的方式可以进行XML的解析和生成。以下是使用Java进行XML解析和生成的基本步骤: 解析XML: DOM (Document Object Model): 这是最常用的解析方法。它将整个XML文档加载到内存中,并允许你通过编程方式遍历和操作它…...

【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

该示例演示了如何使用 LabVIEW FPGA 解码 IS 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标(例如R 系列、CompactRIO)。IS 用于对系统和组件内的数字音频数据进行编码。例如,MP3 播放器或 DVD 播放器内部的数字音频通常使用 …...

linux 安装sipp

sudo apt-get install libnet1-dev libpcap0.8-dev openssl libssl-dev 从 sipp - Browse /sipp/3.2 at SourceForge.net 下载最新版的sipp.svn.tar.gz,解压之后就得到一个rpm文件 tar -zxvf sipp.svn.tar.gz cd sipp make pcapplay_ossl...

c++最值查找

目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n),n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…...

xtu-c语言考试复习-2

1223 确实写不出,数据远超过64位,难道用数组存吗,但是不好计算,想到的思路是取模,一边计算,一边取模,就不会超过数据范围,但是数学原理没懂,所以做不出来 看了下自己以…...

MySQL决战:MySQL数据导入导出

目录 前言 一.navact数据导入导出(第三方工具) 1.导入数据 2.数据导出 二. mysqldump命令导入导出数据 1.mysqldump介绍 2.数据导出 3.数据导入 三.load data file进行数据导入导出(只限于单表) 1.数据导出 增加导出权…...

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

目录 1.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,列出系统自带的几个重要的方法。2.Unity3D中的碰撞器和触发器的区别?3.物体发生碰撞的必要条件?4.简述Unity3D支持的作为脚本的语言的名称?5. .Net与Mono的关系&#x…...

TIDB的忘了root用户密码和数据库密码解决办法

方法一: 1、修改配置文件重启tidb,无密码登录修改root密码 找到配置文件 tidb.toml ,在[security] 作用域下增加如下配置: [security] skip-grant-tabletrue 重启tidb: sh run_tidb.sh 2、重启后,就可以无密…...

QT基础篇(4)QT5基本对话框

1.标准文件对话框类 在QT5中,可以使用QFileDialog类来创建标准文件对话框。QFileDialog类提供了一些方法和属性,用于选择文件和目录。 常用的方法和属性如下: getOpenFileName():打开文件对话框,选择一个文件。 get…...

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…...

SpringSecurity入门demo(三)多用户身份认证

WebSecurityConfigurerAdapter配置文件在 configure(AuthenticationManagerBuilder auth) 方法中完成身份认证。前面的demo都只有一个用户,security中使用UserDetailsService做为用户数据源 ,所以可以实现UserDetailsService 接口来自定义用户。实现方…...

【设计模式-02】Strategy策略模式及应用场景

一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…...

ssh远程登陆

一、ssh远程登陆的概念 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层…...

go如何终止多个for select循环嵌套

空山新雨后&#xff0c;天气晚来秋。 目录 分类说明 总结 分类说明 for select循环嵌套&#xff0c;如何终止&#xff1f;上代码&#xff1a; stop : make(chan struct{})go func() {for i : 1; i < 3; i {fmt.Println("writed ", i)time.Sleep(time.Second * …...

nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施

目录 前言&#xff1a; 一.龙蜥&#xff08;Anolis&#xff09;操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make&#xff1a; *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…...

2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景

目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意&#xff1a; 从 Redis 6.2 版本开始&#xff0c;Zset 命…...

ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放

0、作者杂谈 CSDN大多数都是落后的&#xff0c;要么是到处复制粘贴的&#xff0c;对于初学者我来说困惑了很久&#xff0c;大多数CSDN文章都是使用旧的API &#xff0c;已经被否决了&#xff0c;于是我读一些官方文档&#xff0c;和一些开源项目音视频的输出过程&#xff0c;写…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...