promise

是什么

Promise 是 JavaScript 中用于处理异步操作的一种对象。它代表了一个尚未完成但承诺会在未来某个时候完成的操作,并允许你在操作完成前注册回调函数。

  • 三种状态

    • Pending 等待
    • Fulfilled 完成
    • Rejected 失败
  • 两个过程
    状态只能由 Pending --> Fulfilled 或者 Pending --> Rejected,且一但发生改变便不可二次修改

  • 三个方法

    then:注册fulfilled状态回调函数

    catch:注册rejected状态回调函数

    finally:注册无论成功或失败都会执行的回调函数

属于微任务 是异步任务的一种

Promise.prototype 原型上的方法

Promise.prototype.then

- .then()方法用于指定当Promise对象的状态变为fulfilled时要执行的回调函数。
 - 它接受两个可选的回调函数作为参数:第一个用于处理成功的情况,第二个(可选的)用于处理错误(但通常不会在这里处理错误,而是使用.catch())。
 * 该方法返回结果是一个新的Promise实例,可以继续调用then方法

Promise.prototype.catch

  • .catch()方法用于指定当Promise对象的状态变为rejected(即异步操作失败)时要执行的回调函数。
  • 它只接受一个回调函数作为参数,该回调函数会接收被reject方法传递的错误信息。
getJSON('/posts.json')
.then(function(posts) {// ...
})
.catch(function(error) {// 处理 getJSON 和 前一个回调函数运行时发生的错误console.log('发生错误!', error);
});

上面代码中,getJSON()方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then()方法指定的回调函数;
如果异步操作抛出错误,状态就会变为rejected,就会调用catch()方法指定的回调函数,处理这个错误。

另外,then()方法指定的回调函数,如果运行中抛出错误,也会被catch()方法捕获。

Promise.prototype.finally()

finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

Promise 类上方法

处理多个异步操作

Promise.all()

Promise.all()接收promise对象数组,返回一个新的promise对象,当数组中所有promise都解决时成功时,返回的promise对象才会解决

const p = Promise.all([p1, p2, p3]);
  • 上面代码中,Promise.all()方法接受一个数组作为参数,p1p2p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。

p的状态由p1p2p3决定,分成两种情况。

  1. 只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

  2. 只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

Promise.allSettled()

接收一个 promise 对象数组,并返回一个新的 promise。无论数组中的 promise 是解决还是拒绝,返回的 promise 都会解决

有时候,我们希望等到一组异步操作都结束了,不管每一个操作是成功还是失败,再进行下一步操作。
例如获取多个用户的信息,当有几个用户信息成功获取到进行处理

Promise.all()方法只适合所有异步操作都成功的情况,如果有一个操作失败,就无法满足要求。

// Promise.all 示例
const promise1 = Promise.resolve(3);
const promise2 = Promise.resolve(42);
const promise3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');
});Promise.all([promise1, promise2, promise3]).then(values => {console.log(values); // [3, 42, "foo"]
}).catch(error => {console.error('Error:', error);
});

Promise.all 更适用于处理所有 promise 都需要成功的情况,

而 Promise.allSettled 更适用于需要知道每个 promise 结果的情况。

const promise4 = Promise.resolve(3);
const promise5 = new Promise((resolve, reject) => {setTimeout(reject, 100, 'error');
});
const promise6 = Promise.resolve(42);Promise.allSettled([promise4, promise5, promise6]).then(results => {results.forEach(result => console.log(result.status));// fulfilled// rejected// fulfilled
});
Promise.race()

Promise.race()接收promise对象数组,返回一个新的promise对象,当数组中有一个promise解决时无论成功还是失败,返回的promise对象就会解决

const p = Promise.race([p1, p2, p3]);

上面代码中,只要p1p2p3之中有一个实例率先改变状态p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

Promise.race()方法的参数与Promise.all()方法一样,如果不是 Promise 实例,就会先调用下面讲到的Promise.resolve()方法,将参数转为 Promise 实例,再进一步处理。

Promise.any()

接收promise数组,返回一个新的 Promise

Promise.any([fetch('https://v8.dev/').then(() => 'home'),fetch('https://v8.dev/blog').then(() => 'blog'),fetch('https://v8.dev/docs').then(() => 'docs')
]).then((first) => {  // 只要有一个 fetch() 请求成功console.log(first);
}).catch((error) => { // 所有三个 fetch() 全部请求失败console.log(error);
});
  • 只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;
  • 如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

Promise.any()Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。

创建promise对象

Promise.resolve()

Promise.resolve() 方法一般情况下返回一个状态为已解决的 Promise 对象。
参数可以是:

  1. 一个 Promise 对象:直接返回该 Promise 对象。
  2. 一个 thenable 对象(即具有 then 方法的对象):将其视为 Promise 对象并返回一个新的 Promise,该 Promise 会采用该 thenable 对象的最终状态。
  3. 非 Promise/thenable 值:返回一个新的已解决的 Promise 对象,其解决值为该参数值。
Promise.reject()

Promise.reject() 方法返回一个状态为已拒绝的 Promise 对象。
参数是拒绝理由,可以是任何类型的值(通常是一个 Error 对象或字符串)。

为什么

  • 在js中实现异步操作
  • 可以链式调用,解决回调地狱的问题

回调地狱

fs.readFile('file1.txt', function(err, data1) {if (err) throw err;fs.readFile('file2.txt', function(err, data2) {if (err) throw err;fs.readFile('file3.txt', function(err, data3) {if (err) throw err;// 继续嵌套下去...});});
});

Promise 的链式调用可以让我们避免回调地狱。每个 .then 方法都会返回一个新的 Promise,因此可以使用链式调用处理多个异步操作

怎么办

创建promise对象

  1. new Promise(excutor(resolve,reject))
  • 初始化,接收执行器函数作为参数,
  • 执行器函数的参数是两个函数(js内置),用来改变promise的状态

执行器函数是同步执行的

  1. Promise.resolve()/reject()
  • 一般情况下返回的是状态已经改变的promise

代码

基础用法

//1.基本用法let promise = new Promise((resolve,reject)=>{//异步操作setTimeout(()=>{let success=false;//异步操作的结果if(success){resolve('操作成功')//操作成功,传递结果}else{reject('操作失败')//操作失败,传递原因}},1000)})promise.then(res=>{console.log(res);//操作成功时处理}).catch(err=>{console.log(err);//操作失败时处理})

链式调用

//链式调用new Promise((resolve,reject)=>{setTimeout(()=>{resolve(1)},1000)}).then((res)=>{console.log(res); //1return res*2;}).then((res)=>{console.log(res); //2return res*2;}).then((res)=>{console.log(res); //4}).catch(err=>{console.log(err);})

多个promise的并发处理

//3.多个promise并发处理let promise1 = new Promise(resolve => setTimeout(() => resolve('Promise 1 完成'), 1000));let promise2 = new Promise(resolve => setTimeout(() => resolve('Promise 2 完成'), 2000));// Promise.all([promise1,promise2]).then((ress)=>{//     console.log(ress);//[ 'Promise 1 完成', 'Promise 2 完成' ]// }).catch(err=>{//     console.log(err);// })// 使用 Promise.race 只等待第一个完成的 PromisePromise.race([promise1, promise2]).then(result => {console.log(result); // "Promise 1 完成"}).catch(error => {console.error(error);});

与async/await结合使用

  • async 声明一个函数是异步的
  • await 暂停异步函数的执行,等待Promise解决后再继续执行。
//4. 与 async/await 结合使用let promise1 = new Promise(resolve => setTimeout(() => resolve('Promise 1 完成'), 1000));let promise2 = new Promise(resolve => setTimeout(() => resolve('Promise 2 完成'), 2000));async function myPromise() {try{let result1 = await promise1; // 等待 promise1 完成console.log(result1);let result2 = await promise2; // 等待 promise2 完成console.log(result2);}catch (err){console.log(err);}}myPromise()

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode104:二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

使用 Python 脚本在 Ansys Mechanical 中创建用于后处理的螺栓工具

介绍 由螺栓连接定义的接头在工业应用中非常普遍。在 Ansys Mechanical FEA 中分析它们是一种非常常见的做法。通过Object Generator或Bolt Tools Add-on,使用线体、梁连接甚至3D实体中的梁单元,在Ansys Mechanical中生成螺栓连接非常容易。定义螺栓联接…

【Excel】数据透视表分析方法大全

数据透视表的最常用的功能是分类汇总,其实它还有很强大的数据分析功能。在数据透视表右键菜单的值显示方式中,可以看到有14个很实用的分析选项。 1、总计的百分比 作用:透视表中每一个数字(包括汇总行、总计行)占右…

电子工牌独立双通道定向拾音方案(有视频演示)

现在一些行业的客服人员在面对客户都要求使用电子工牌分别记录客服和顾客的声音,我们利用双麦克风阵列双波束拾音的方案设计了一个电子工牌方案.可以有效分别记录客服和顾客的声音. 方案思路: 我们采用了一个双麦阵列波束拾音的模块A-59,此模块可以利用2个麦克风组成阵列进行双…

Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法,当时还有最为关键的notify服务通知更新的部分源码没有学习,本次我们来学习notify通知本地服务更新的源码。 Dubb…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明! ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…

WSL2安装Ubuntu22.04并开启GPU进行ML学习教程

文章目录 一 启用 WSL2二、安装 Ubuntu三 安装 NVIDIA GPU 驱动和 CUDA 工具四、安装pytouch运行环境 这几天一直在研究下,怎么在笔记本win11电脑上安装linux系统用于机器学习、深度学习、大模型等相关的研究,前面试了VMWARE、HYPER-V等方式,…

用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)

梯度下降(Gradient Descent)/导数(Derivatives) 引言1. 参数对输出的影响2. 斜率(The Slope)3. 数值导数(The Numerical Derivative)4. 解析导数(The Analytical Derivat…

Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件

本文将介绍一种手动的轻量级的方式,还原HTTP/TLS协议中传输的文件,为流量数据包中的文件分析提供帮助。 如果捕获的数据包中存在非文本类文件,例如png,jpg等图片文件,或者word,Excel等office文件异或是其他类型的二进…

Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

由于es高亮显示机制的问题。当全文内容过多,且搜索中标又少时,就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。 1.根据es的ik分词器获取搜索词的分词结果。 es部分: //中文分词解析 post /_analyze {"analyzer":"…

一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Fei Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节我们主要来学习scanf的基本用法,了解scanf返回值,懂得scanf占位符和…

Kafka一些常用的命令行操作【包含主题命令、生产者和消费者命令】

文章目录 1、主题命令2、生产者命令行操作3、消费者命令行操作 1、主题命令 查看当前服务器中的所有 topic: kafka-topics.sh --bootstrap-server node01:9092 --list 创建topic: kafka-topics.sh --bootstrap-server node01:9092 --create --topic to…

基于物联网的温室大棚控制系统

本设计采用物联网方案,用STM32f103c8t6作为主控芯片,采用DHT11作为温湿度传感器,采集CO2使用JW01-CO2-V2.2传感器模块,并且通过BH1750传感器模块采集光照,通过土壤湿度传感器来获取大棚内部土壤湿度,ESP-01…

Ubuntu24安装配置NDK

1、下载NDK 下载压缩包,下载地址如下,建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如:/opt 或者先解压,再移动到指定目录下。 3、配置环境变量 找到…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为:HyperText Mark-up Language, 指的是…

使用etl工具kettle的日常踩坑梳理之二、从Hadoop中导出数据

想操作MySQL等关系型数据库的可以访问我上一篇文章,本章主要介绍操作Hadoop等大数据组件。 根据2024年11月份测试了kettle工具在9.3及以上版本已经没有内置连接大数据(如Hadoop)组件了。 建议安装9.2及以下的,我这里送上8.3.0版本的请用百度网盘下载链…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来,安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者,凭借其强大的视频处理、汇聚与融合能力,展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁

近日,贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判,判处其死刑,剥夺政治权利终身,并处没收个人全部财产。这一判决不仅彰显了法律的威严,也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS(读取时间戳计数器)指令是 x86/x86_64 架构中的…