浅谈对Promise的理解。

一、Promise定义

        JS中用于处理异步操作的编程模式。一个Promise是一个代理,它代表一个创建Promise时不一定已知的值。它允许我们将处理的程序与异步操作的最终成功值或失败值原因想关联起来。这使得异步方法可以像同步方法一样返回值:异步方法不会立即返回最终值,而是返回一个Promise,以便在将来的某个时间点提供该值。

二、Promise的三种状态

pending:表示初始状态,未完成,也未被拒绝。

fulfilled:表示成功完成。

rejected:表示操作失败。

三、Promise的链式调用

        Promise.prototype.then()、Promise.prototype.catch()、Promise.prototype.finally(),由于这些方法返回了Promise,因此可以被链式调用。

        .then()方法最多接受两个参数:第一个参数是成功的回调,第二个参数是拒绝时的参数。每个.then()返回一个新生成的Promise对象,这个对象可被链式调用。如果.then()方法中处理拒绝状态的回调函数,且没有返回一个新的Promise,那么Promise会继续执行下一个.then(),一般将错误处理推迟到Promise链末尾,使用.catch()捕获整个链中任何拒绝状态。将错误处理推迟到.catch()能更好的组织代码,集中处理拒绝状态。

        一个Promise的终止条件决定了链中下一个Promise的“已敲定”状态。fulfilled表示Promise成功完成,rejected表示Promise执行失败。链中成功的Promise返回值传递给下一个.then(),而已拒绝的Promise把失败的原因传递给链中下一个拒绝处理函数。

        链式调用中Promise就像俄罗斯套娃一样,是嵌套起来的,但又像一个栈,每次都从顶端被弹出。链式调用中第一个Promise是嵌套最深的,也是第一个被弹出的。

四、Promise并发

1、Promise.all()

        Promise.all()静态方法接受一个Promise可迭代对象作为输入,并返回一个Promise。当所有输入的Promise都成功时,会返回一个所有成功值的数组。如果输入任何Promise被拒绝,返回的Promise将被拒绝,并带有第一个被拒绝的原因。

语法:

Promise.all(iterable)

iterable一个可迭代对象,例如Array或String。

2、Promise.allsettled()

        Promise.allSettled() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个单独的 Promise。当所有输入的 Promise 都已敲定时(包括传入空的可迭代对象时),返回的 Promise 将被兑现,并带有描述每个 Promise 结果的对象数组。

语法:

Promise.allSettled(iterable)

Promise.allSettled() 方法是 promise 并发方法之一。在你有多个不依赖于彼此成功完成的异步任务时,或者你总是想知道每个 promise 的结果时,使用 Promise.allSettled() 。

相比之下,如果任务相互依赖,或者如果你想在任何 promise 被拒绝时立即拒绝,Promise.all() 返回的 Promise 可能更合适。

3、Promise.any()

    Promise.any() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个 Promise。当输入的任何一个 Promise 兑现时,这个返回的 Promise 将会兑现,并返回第一个兑现的值。当所有输入 Promise 都被拒绝(包括传递了空的可迭代对象)时,它会以一个包含拒绝原因数组的 AggregateError 拒绝。

Promise.any() 方法是 Promise 并发方法之一。该方法对于返回第一个成功的 Promise 非常有用。一旦有一个 Promise 成功,它就会立即返回,因此不会等待其他 Promise 完成。

与 Promise.all() 返回一个成功值数组不同的是,我们只会得到一个成功值(假设至少有一个 Promise 成功)。此方法对于那些如果我们只需要一个 Promise 成功,但不在意哪一个成功的情况更有益。请注意另一个区别:该方法在接收到空的可迭代对象时会拒绝,因为实际上,该可迭代对象不包含任何兑现的项。你可以将 Promise.any() 和 Promise.all() 与 Array.prototype.some() 和 Array.prototype.every() 进行比较。

同时,与 Promise.race() 返回第一个敲定(无论是成功还是失败)的值不同的是,该方法返回第一个成功的值。该方法忽略所有被拒绝的 Promise,直到第一个被兑现的 Promise。

使用场景:显示第一张已加载的图片

4、Promise.race()

        Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。

Promise.race() 方法是 Promise 并发方法之一。当你想要第一个异步任务完成时,但不关心它的最终状态(即它既可以成功也可以失败)时,它就非常有用。

如果可迭代对象中包含一个或多个非 promise 值和/或已敲定的 promise,则 Promise.race() 将以可迭代对象中找到的第一个此类值敲定。

请注意,JavaScript 的本质上是单线程的,因此在任何时刻,只有一个任务会被执行,尽管控制权可以在不同的 Promise 之间切换,从而使 Promise 的执行看起来是并发的。在 JavaScript 中,并行执行只能通过 worker 线程实现。

五、实例属性

        这些属性定义在 Promise.prototype 上,由所有的 Promise 实例共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/305140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】SDXL tensorRT 推理,Stable Diffusion 转onnx,转TensorRT

文章目录 sdxl 转 diffusers转onnx转TensorRT sdxl 转 diffusers def convert_sdxl_to_diffusers(pretrained_ckpt_path, output_diffusers_path):import osos.environ["HF_ENDPOINT"] "https://hf-mirror.com" # 设置 HF 镜像源(国内用户使…

交叉编译ARM64架构electron详解

基本介绍 本文主要参考Electron官方文档中 构建说明 和 构建步骤(Linux) 在amd64环境内构建arm64的electron包。 如果是arm64环境请查看文章arm64架构编译electron长征路 一、环境说明 操作系统版本:统信1060 操作系统架构:amd64 内存:32G 如下图: electron版本:v25…

unity小程序websocket:nginx配置https (wss)转http (ws)及其他问题解决

目录 前言 实际运用场景 处理流程如下 nginx配置ssl和wss 配置过程中遇到的问题 1、无法连接服务器 2、通过IP可以访问,域名却不行 问题描述 解决 3、如何判断该域名是否备案了 前言 为了服务器网络的通用性,我们在实现移动端的游戏转微信小程序…

【论文精读WACV_2023】FaceOff: A Video-to-Video Face Swapping System

【论文精读WACV_2023】FaceOff: A Video-to-Video Face Swapping System 一、前言Abstract1. Introduction2. Related Work3. FaceOff: Face Swapping in videos3.1. Merging Videos using Quantized Latents3.2. Self-supervised Training Approach3.3. Reproducing Inference…

虾皮商品标题:如何创建有效的虾皮商品标题

虾皮(Shopee)平台是一个非常受欢迎的电商平台,为卖家提供了一个广阔的销售渠道。在虾皮上,一个有效的商品标题是吸引潜在买家注意力的关键元素之一。一个好的商品标题能够吸引更多的点击和浏览量,从而提高销售机会。下…

FineBI实战项目一(7):每天每小时上架商品个数

1 明确数据分析目标 对所有商品的商家时间进行统计,统计每个小时上架商品的个数 2 创建用于保存数据分析结果的表 create table app_hour_goods(id int primary key auto_increment,daystr varchar(20),hourstr varchar(20),cnt int ); 3 编写SQL语句进行数据分析…

HTAP(Hybrid Transactional/Analytical Processing)系统之统一存储的实时之道

文章目录 HTAP与时俱进LASER中的存储关键知识LSM(Log-Structured Merge Tree)SkipList(跳表)CDC(Changed Data Capture)SST(Sorted Sequence Table) 特性列组(Column Gro…

什么是GeoTrust证书?

GeoTrust是全球知名的数字证书颁发机构,提供一系列安全解决方案,旨在帮助客户保护敏感数据并验证在线身份。其证书广泛应用于各类网站,为企业和个人提供安全保障。 GeoTrust证书受到欢迎的原因主要有以下几点: 快速部署&#xff…

Modern C++ code snippets

目录 1. 限制模板函数的模板参数类型 2. CRTP (Curiously Recurring Template Pattern) 3. 元编程insights 4. 完美转发 5. 工厂模式 6. Lamdba表达式 7. RAII - 自动释放资源 8. 其它小伎俩 1. 限制模板函数的模板参数类型 #include <iostream> #include <typ…

编程学习课前准备

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 浏览器和文本编辑器安装 数据分析三大软件安装 操作系统要求 查看Windows系统版本和位数 查看操作系统账户信息 Windows目录显式设置 命令行界面使用 打开命令行 方法一&#xff1a; 方法二&#xff1a; 方法…

【Linux系统编程二十七】:线程的互斥与同步(互斥锁的使用与应用)

【Linux系统编程二十七】&#xff1a;线程的互斥与同步(互斥锁的使用与应用&#xff09; 一.问题:数据不一致(混乱/不安全)1.多线程并发计算不安全2.将数据加载到寄存器的本质 二.解决方法--互斥锁三.互斥锁的概念与接口1.定义锁2.加锁/解锁 四.互斥锁实现原理与应用1.原理&…

离散数学2

复习一下&#xff0c;P->Q,只有真的原因推假的结果&#xff0c;才是错的&#xff08;正常逻辑&#xff09;&#xff0c;其余情况都是对的&#xff08;善意规定以及正常逻辑&#xff09; 反P析取Q&#xff0c;可以这样理解&#xff0c;因为是析取&#xff0c;结果为T的可能性…

C++学习笔记(二十七):c++ 动态数组vector及优化

c的动态数组vector是STL的内容&#xff0c;关于STL&#xff0c;有兴趣可自行网上搜索资料。本节主要介绍vector的基本内容以及vector的简单优化。vector当超过数组最大范围&#xff0c;需要往里面添加新的元素时&#xff0c;会在内存中创建一个比上一个更大的数组&#xff0c;将…

单例模式---JAVA

目录 “饿汉”模式 完整代码 “懒汉”模式 完整代码 单例模式&#xff1a;保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。 单例模式可以通过实例创建的时间来分为两种&#xff1a;“饿汉”和“懒汉”模式。 “饿汉”模式 所谓的“饿汉”模式实则就是在类…

Spring Boot 接入 KMS 托管中间件密码第三方接口密钥

1. 需求 Nacos中关于中间件的密码&#xff0c;还有第三方API的密钥等信息&#xff0c;都是明文存储&#xff0c;不符合系统安全要求。现需对这些信息进行加密处理&#xff0c;Nacos只存储密文&#xff0c;并在服务启动时&#xff0c;调用云厂商的KMS接口进行解密&#xff0c;将…

vue2移动端网页图片触摸滑动改变top和left以及双指对图片进行缩放

代码(这个是vue2中的代码,可以稍加转换vue3也可以用) <template><div class"coach_daily"><div class"coach_daily-inline"><div style"width: 100%;height: 100%;overflow: hidden;position: relative;z-index: 10;"touc…

机器视觉在OCR字符检测的应用

在产品质量 检测过程中&#xff0c;对于字符、条码等标识信息的识别、读取、检测是非常重要的一部分&#xff0c;比如在食品饮料包装检测中&#xff0c;生产日期 、保质期 、生产批号 、条码等字符信息是产品管理和追溯必不可缺的&#xff0c;因此利用机器视觉技术进行OCR字符采…

单片机烧入代码没有反应

我们通过stlink或者jlink烧写代码&#xff0c;单片机的电源灯已经被点亮&#xff0c;但是烧入代码之后没有现象 可能的原因如下 1、没有勾选下列选项&#xff0c;或者自己手动复位也可以运行 2、供电不足 尽管单片机有串口调试助手或者仿真器供电&#xff0c;但是实际上 单片…

Codeforces Hello 2024 A~D,F1

A.Wallet Exchange(思维) 题意&#xff1a; Alice和Bob各自拥有 a , b a,b a,b枚硬币&#xff0c;他们决定以Alice为先手开始比赛&#xff0c;比赛中每人在每轮需按顺序执行操作1和操作2&#xff1a; 操作1&#xff1a;交换两人手上拥有的硬币数量&#xff0c;或什么都不做 …

Java学习笔记-day02-在IDEA中使用git忽略提交.idea下的文件

1.在根目录.gitignore文件排除.idea目录 ### IntelliJ IDEA ### .idea2.使用重置Head还原已经add过的文件 创建项目时&#xff0c;可能会有.idea中的文件先add到git后再创建的.gitignore文件&#xff0c;导致文件commit时无法排除&#xff0c;如下所示。 使用重置Head将文件…