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循环嵌套
空山新雨后,天气晚来秋。 目录 分类说明 总结 分类说明 for select循环嵌套,如何终止?上代码: 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” 问题】解决措施
目录 前言: 一.龙蜥(Anolis)操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make: *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…...

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

ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放
0、作者杂谈 CSDN大多数都是落后的,要么是到处复制粘贴的,对于初学者我来说困惑了很久,大多数CSDN文章都是使用旧的API ,已经被否决了,于是我读一些官方文档,和一些开源项目音视频的输出过程,写…...

C++ 字符串哈希 || 字符串前缀哈希法
字符串Hash就是构造一个数字使之唯一代表一个字符串。但是为了将映射关系进行一一对应,也就是,一个字符串对应一个数字,那么一个数字也对应一个字符串。 用字符串Hash的目的是,我们如果要比较一个字符串,我们不用直接比…...

【java】项目部署liunx服务器的简单步骤
在Linux服务器上部署Java项目通常涉及到一系列步骤,下面是一个基本的部署流程,具体步骤可能会根据项目和服务器环境的不同而有所调整: 1. 准备工作: 1.1 安装Java环境: 在Linux服务器上安装Java运行环境,…...

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化
文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力,那下一步我们还…...

鸿蒙开发现在就业前景怎样?
随着科技的不断进步,鸿蒙系统逐渐崭露头角,成为智能设备领域的一颗新星。作为华为自主研发的操作系统,鸿蒙系统拥有着广阔的市场前景和就业机会。那么,鸿蒙开发的就业前景究竟怎样呢? 一、市场需求持续增长 随着鸿蒙…...

试用统信服务器操作系统UOS 20
作者:田逸(formyz) 试用统信Linux操作系统UOS,想了解一下用已有的Linux经验能否轻松驾驭它。以便在某些场景下,可以多一种选择。本次试验在Proxmox VE 8(以下简称PVE 8)平台下进行,采…...

[情商-11]:人际交流的心理架构与需求层次模型
目录 前言: 一、心理架构 1.1 个体生理层 1.2 个体心理层 1.3 点对点人际交流层 1.4 社会网络层 1.5 社会价值层 二、人的需求层次模型 2.1 需求(欲望)层次模型 2.2 基因与人需求之间的关系 2.3 个体生理需求 2.4 个体的心理需求…...

【.NET Core】Lazy<T> 实现延迟加载详解
【.NET Core】Lazy 实现延迟加载详解 文章目录 【.NET Core】Lazy<T> 实现延迟加载详解一、概述二、Lazy<T>是什么三、Lazy基本用法3.1 构造时使用默认的初始化方式3.2 构造时使用指定的委托初始化 四、Lazy.Value使用五、Lazy扩展用法5.1 实现延迟属性5.2 Lazy实现…...

坑记(HttpInputMessage)
一、背景知识 public interface HttpInputMessage extends HttpMessage Represents an HTTP input message, consisting of headers and a readable body.Typically implemented by an HTTP request on the server-side, or a response on the client-side.Since: 3.0 Author:…...

day04打卡
day04打卡 面试题 02.07. 链表相交 时间复杂度:O(N),空间复杂度:O(1) 第一想法:求出两个链表长度,走差距步,再遍历找有没有相交 /*** Definition for singly-linked list.* struct ListNode {* int…...

语义分割miou指标计算详解
文章目录 1. 语义分割的评价指标2. 混淆矩阵计算2.1 np.bincount的使用2.2 混淆矩阵计算 3. 语义分割指标计算3.1 IOU计算方式1(推荐)方式2 3.2 Precision 计算3.3 总体的Accuracy计算3.4 Recall 计算3.5 MIOU计算 参考 MIoU全称为Mean Intersection over Union,平均…...