【无标题】JavaScript 高阶 Promise篇

1、什么是Promise

Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。(ps:关于原型:JavaScript高级 构造函数与原型篇)

Promise对象有以下两个特点。

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise功能:避免了回调地狱,把异步代码改成调用起来像同步代码。

        // 语法:// Promise————// var  p = new Promis(回调函数)// 回调函数也有两个参数// resolve ---------坚定// reject-----------拒绝var p = new Promise((resolve,reject)=>{//默认状态——————pending// 调用函数----resolve();// 得到// 成功状态————fulfilled// 调用函数——--reject()// 失败状态————rejected  // resolve();reject();})console.log(p);// 特点:1、转态不受外部影响// 2、状态一旦发生改变,将不再变化

Promise的基本用法:

// 默认pending: 初始状态
var p=new Promise(function (resolve,reject) {if("操作成功"){resolve();//pending-->fulfilled  异步操作成功的回调函数}else{reject(); //pending-->reject     异步操作失败的回调函数}
})
p.then(data => {//在外面调用then处理成功的逻辑console.log("处理成功的逻辑");//fulfilled  
}).catch(err=>{//在外面调用catch处理失败的逻辑console.log("失败的逻辑");//reject
})
// then方法会在异步成功后调用,catch方法会在异步失败后调用如果需要连续调用,就要用return比如:p1.then(data1 => {console.log(data1);return p2}).then(data2 => {console.log(data2);return p3}).then(data3 => {console.log(data3);})

2、Promise方法的使用

2.1、all方法

接收一个Promise实例对象组成的数组,[p1,p2,p3]

只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

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

const p1 = new Promise((resolve, reject) => {setTimeout(() => {reject("失败");}, 3000);
});
const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve("成功2");}, 2000);
});
const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve("成功3");}, 1000);
});// 全部成功返回成功,有一个失败返回失败
let p = Promise.all([p1, p2, p3]).then((res) => console.log(res)).catch(err=>console.log(err));

2.2、allSettled方法

接收一个Promise实例对象组成的数组,[p1,p2,p3]

返回是一个promise,then回调函数中得到每一个promise的详细结果,无论该promise是成功还是失败

      const p1 = new Promise((resolve, reject) => {setTimeout(() => {reject('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {//resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {reject('ok3')}, 1000)})Promise.allSettled([p1, p2, p3]).then((res) => {console.log(res)}).catch((err) => {console.log(err)})

2.3、any方法

接收一个Promise实例对象组成的数组,[p1,p2,p3]
只要有一个成功的promise对象,就返回这个成功的Promise

      const p1 = new Promise((resolve, reject) => {setTimeout(() => {reject('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {//resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {reject('ok3')}, 1000)})Promise.any([p1, p2, p3]).then((res) => {console.log(res) }).catch((err) => {console.log(err)})

2.4、race方法

all是等所有的异步操作都执行完了再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。先执行完的不管是进行了race的成功回调还是失败回调,其余的将不会再进入race的任何回调

 
function promiseClick1(){let p = new Promise(function(resolve, reject){setTimeout(function(){var num = Math.ceil(Math.random()*20); //生成1-10的随机数console.log('2s随机数生成的值:',num)if(num<=10){resolve(num);}else{reject('2s数字太于10了即将执行失败回调');}}, 2000);})return p}function promiseClick2(){let p = new Promise(function(resolve, reject){setTimeout(function(){var num = Math.ceil(Math.random()*20); //生成1-10的随机数console.log('3s随机数生成的值:',num)if(num<=10){resolve(num);}else{reject('3s数字太于10了即将执行失败回调');}}, 3000);})return p}function promiseClick3(){let p = new Promise(function(resolve, reject){setTimeout(function(){var num = Math.ceil(Math.random()*20); //生成1-10的随机数console.log('4s随机数生成的值:',num)if(num<=10){resolve(num);}else{reject('4s数字太于10了即将执行失败回调');}}, 4000);})return p}Promise.race([promiseClick3(), promiseClick2(), promiseClick1()]).then(function(results){console.log('成功',results);},function(reason){console.log('失败',reason);});

2.5、catch方法

与Promise对象方法then方法并行的一个方法就是catch,与try catch类似,catch就是用来捕获异常的,也就是和then方法中接受的第二参数rejected的回调是一样的,如下:

function promiseClick(){let p = new Promise(function(resolve, reject){setTimeout(function(){var num = Math.ceil(Math.random()*20); //生成1-10的随机数console.log('随机数生成的值:',num)if(num<=10){resolve(num);}else{reject('数字太于10了即将执行失败回调');}}, 2000);})return p}promiseClick().then(function(data){console.log('resolved成功回调');console.log('成功回调接受的值:',data);}).catch(function(reason, data){console.log('catch到rejected失败回调');console.log('catch失败执行回调抛出失败原因:',reason);});	

2.7、resolve方法与reject方法

resolve返回一个成功的promise
reject返回一个失败的promise

function promiseClick(){let p = new Promise(function(resolve, reject){setTimeout(function(){var num = Math.ceil(Math.random()*20); //生成1-10的随机数console.log('随机数生成的值:',num)if(num<=10){resolve(num);}else{reject('数字太于10了即将执行失败回调');}}, 2000);})return p}promiseClick().then(function(data){console.log('resolved成功回调');console.log('成功回调接受的值:',data);}, function(reason){console.log('rejected失败回调');console.log('失败执行回调抛出失败原因:',reason);});	

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是 Web3.0

什么是Web3.0 对于 Web3.0 的解释网上有很多&#xff0c;目前来说 Web3.0 是一个趋势&#xff0c;尚未有明确的定义。我们今天讨论下几个核心的点&#xff0c;就能很好的理解 Web3.0 要解决哪些问题 谁创造数据&#xff0c;这里的数据可以是一篇博客&#xff0c;一段视频&…

Oracle Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

在Vue.js中,什么是mixins?它们的作用是什么?

目录 一、Vue.js介绍 二、什么是mixins 三、mixins的应用场景 四、mixins的优势和作用 一、Vue.js介绍 Vue.js是一种流行的JavaScript前端框架,用于构建交互式的Web界面。它被设计为易于理解和集成的框架,使开发者能够快速构建可复用的组件化应用程序。Vue.js采用了MVVM&a…

如何测试python 版本与 torch 、 torchvision 版本是否对应?

python 版本与 torch 、 torchvision 版本的对应关系如下图所示&#xff1a; 打开 anaconda powershell prompt&#xff0c;输入如下命令&#xff1a; >python>>>import torch>>>c torch.ones((3,1)) //创建矩阵>>>c c.cuda(0) …

云原生周刊:Meshery v0.70 发布 | 2024.1.22

开源项目推荐 flux-cluster-template 该项目用于部署由 Flux、SOPS、GitHub Actions、Renovate、Cilium 等支持的 Kubernetes 集群&#xff0c;专注于使用 GitOps 实践和基础设施自动化。 Kine 该项目可以在 MySQL、Postgres、SQLite、Dqlite 等数据库上运行 Kubernetes&am…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备&#xff1a; keepalived_master1服务器nginx&#xff1a;172.20.26.167 keepalived_master2服务器nginx&#xff1a;172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…

分布式深度学习中的数据并行和模型并行

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

LLMs之Vanna:Vanna(利用自然语言查询数据库的SQL工具+底层基于RAG)的简介、安装、使用方法之详细攻略

LLMs之Vanna&#xff1a;Vanna(利用自然语言查询数据库的SQL工具底层基于RAG)的简介、安装、使用方法之详细攻略 目录 Vanna的简介 1、用户界面 2、RAG vs. Fine-Tuning 3、为什么选择Vanna&#xff1f; 4、扩展Vanna Vanna的安装和使用方法 1、安装 2、训练 (1)、使用…

c#中使用UTF-8编码处理多语言文本的有效策略

使用UTF-8编码处理多语言文本的有效策略 在当今的全球化时代&#xff0c;软件开发者常常需要处理包含多种语言的文本。这不仅涉及英文和其他西方语言&#xff0c;还包括中文、日文、韩文等多字节字符系统。在这篇博客中&#xff0c;我将探讨如何有效地使用UTF-8编码来处理混合语…

项目管理认证 | 什么是PMP项目管理?PMP证书有什么用?

01 什么是项目管理&#xff1f; 项目管理&#xff1f;听起来似乎离我们很遥远。其实不然&#xff0c; 学习了项目管理知识后&#xff0c;你会发现&#xff0c;“一切都是项目&#xff0c;一切也将成为项目”。 你可以把港珠澳大桥的建设、开发一款新型手机、开发一个好用的C…

HarmonyOS 发送http网络请求

好 本文 我们来说 http请求 首先 我们要操作网络内容 需要申请权限 项目中找到 main目录下的module.json5 最下面加上 "requestPermissions": [{"name": "ohos.permission.INTERNET"} ]这里 我在本地写了一个get接口 大家可以想办法 弄一个后…

为什么两个向量的内积等于模长乘夹角?

为什么两个向量的内积等于模长乘夹角? 已知两个向量 a = [ a 1 , a 2 ] a=[a_1,a_2] a=[a1​,a2​]和 b = [ b 1 , b 2 ] b=[b_1,b_2] b=[b1​,b2​],他们的内积为 a b = a 1 b 1 + a 2 b 2 ab=a_1b_1+a_2b_2 ab=a1​b1​+a2​b2​,看书上的定义该内积的值是一个标量,并且等…

RabbitMQ交换机

目录 交换机类型 直连交换机&#xff1a;Direct exchange 主题交换机&#xff1a;Topic exchange 扇形交换机&#xff1a;Fanout exchange 首部交换机&#xff1a;Headers exchange 死信交换机&#xff1a;Dead Letter Exchange 交换机的属性 代码实战 直连&#…

x-cmd pkg | frp - 内网穿透工具

简介 frp&#xff08;Fast Reverse Proxy&#xff09;是一个专注于内网穿透的高性能反向代理应用&#xff0c;可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 它采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 的机器上&#xff0c;客户端部…

使用torch实现RNN

在实验室的项目遇到了困难&#xff0c;弄不明白LSTM的原理。到网上搜索&#xff0c;发现LSTM是RNN的变种&#xff0c;那就从RNN开始学吧。 带隐藏状态的RNN可以用下面两个公式来表示&#xff1a; 可以看出&#xff0c;一个RNN的参数有W_xh&#xff0c;W_hh&#xff0c;b_h&am…

[AutoSar]BSW_OS 06 Autosar OS_Alarms

一、 目录 一、关键词平台说明一、Timer1.1 配置1.2Periodical Interrupt Timer (PIT)和High Resolution Timer (HRT) 二、Alarm 工作机制三、Code3.1创建一个15ms的runnable3.2mapping到basic task3.3生成代码 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueO…

HJ8 合并表记录【C语言】

【华为机试题 HJ8】合并表记录 描述输入描述:输出描述:示例1示例2参考代码1描述 数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。 提示: 0 <= index <= 11…

写一段圆弧插补算法程序

以下是一个简单的圆弧插补算法程序的示例&#xff1a; #include <iostream> #include <cmath>// 圆弧插补算法 void arcInterpolation(double x1, double y1, double x2, double y2, double cx, double cy, double r) {// 计算圆心到起始点和终点的向量double v1x…

k8s的helm

1、在没有helm之前&#xff0c;部署deployment、service、ingress等等 2、helm的作用&#xff1a;通过打包的方式&#xff0c;deployment、service、ingress这些打包在一块&#xff0c;一键部署服务、类似于yum功能 3、helm&#xff1a;官方提供的一种类似于仓库的功能&#…

时间轮设计

目录 基本概念 函数定义 函数实现与测试 测试1结果如下 测试2结果如下 基本概念 时间轮 是一种 实现延迟功能&#xff08;定时器&#xff09; 的 巧妙算法。如果一个系统存在大量的任务调度&#xff0c;时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务…