js进阶笔记之Promise

目录

为什么用Promise

Promise的基本语法

Promise的then方法

then的链式调用

Promise的相关方法


为什么用Promise

JS代码分为同步代码和异步代码

同步: 代码依次执行,上一个任务完成后,下一个任务才执行

异步 遇到耗时任务不必等待其完成,继续执行后面的任务,如定时器,事件回调,ajax请求(axios) js是单线程的,先执行同步代码,后执行异步代码

异步的实现: 通过回调函数来执行的 ,异步容易造成回调地狱

需求 先发第一次请求,等这次请求回来再发另一次请求容易造成回调地狱

为了优化异步流程->Promise

回调函数->Promise->generator->async await

Promise的基本语法

Promise是一个内置构造函数,接受一个函数(executor)作为参数,

该参数函数立即调用,该执行函数可以放同步或异步,

参数函数接受两个形参  resolve   ,reject  ; resolve   ,reject  是函数
 resolve()调用表示成功,reject()调用表示失败。

  const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')//  reject('失败')}, 1000)}))

Promise的then方法

​ promise实例身上有个then方法,then方法有两个参数 ​

第一个参数 成功时候的回调 ​

第二个参数 失败的时候的回调

promise三个状态 默认状态(等待态pending),成功态(fulfilled),失败态(rejected)

成功了就不能失败

      const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')// 成功了就不能失败//  reject('失败')}, 1000)})// promise实例身上有个then方法, then方法有两个参数// 第一个参数 成功时候的回调// 第二个参数 失败时候的回调promise.then((data) => {console.log(data)return new Promise((resolve, reject) => {setTimeout(() => {resolve('data数据2')}, 1000)})},(reason) => {console.log(reason)}).then((data) => {console.log(data)})console.log(456)

then的链式调用

return 的是 基本数据   ,会走下一个then 成功回调
出错了 , 走下一个then失败回调
返回一个promise实例,它成功走then的成功回调,它失败走then的失败回调

const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')// 成功了就不能失败//  reject('失败')}, 1000)})promise.then((data) => {console.log(data)// return 基本数据 会走下一个then成功回调// 出错了 走下一个then失败回调// 返回一个promise实例,它成功走then的成功回调,它失败走then的失败回调// return 'hello'//  throw 123return new Promise((resolve, reject) => {resolve('ok')})},(reason) => {console.log(reason)}).then((data) => {console.log(data)},(r) => {console.log(r)})console.log(456)

Promise的相关方法

promise 6个静态方法:all( ) , any( ), race( ) , allSettled( ) ,reject( ), resolve( )

all
Promise.all( )返回值是promise实例
接收一个数组,数组里可以放多个promise对象
Promise.all( ).then(res)  拿到结果 

静态方法Promise.all( [promise1, promise2,promise3])返回是一个promise
只要有一个失败就不走了,打印失败的信息,就走第二个回调
所有的都成功了,才走then的第一个回调

或者在then后面用.catch(){ }捕获错误的信息

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


allSettled静态方法
Promise.allSettled( )返回数组中每一promise的状态,值
不论成功或失败都能获取每一个promise的具体值

allSettled得到每一个promise的详细结果,无论该promise是成功还是失败

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

race()
Promise.race( [  ])只要谁先执行完,就打印谁的结果
Promise.race()谁先回来(不管成功还是失败)就打印谁的结果

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

any()
Promise.any( )
得到第一个成功的promise
都不成功打印都失败了

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

Promise.reject()得到一个失败的promise
Promise.resolve()得到一个成功的promise
相当于new了一个promise
catch() 可以拿到错误

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

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

相关文章

Java项目调用C/C++ SDK的方案汇总

Java项目调用C/C SDK的方案汇总 背景调研JNIJNativeJNAJavaCPP 背景 Java项目中需要调用到一个C项目,于是对目前通用的解决方案做了一些调研,这里做一个汇总。 调研 JNI JNI:Java Native Interface,JNI是一套编程接口&#xf…

基于社区电商的Redis缓存架构-库存模块缓存架构(下)

基于缓存分片的下单库存扣减方案 将商品进行数据分片,并将分片分散存储在各个 Redis 节点中,那么如何计算每次操作商品的库存是去操作哪一个 Redis 节点呢? 我们对商品库存进行了分片存储,那么当扣减库存的时候,操作…

《代码整洁之道》摘抄

《代码整洁之道:程序员的职业素养》摘抄 1 专业主义(开发人员应该怎么保证代码质量) 专业人士,就是能对自己犯下的错误负责的人,哪怕那些错误实际上在所难免。所以,雄心勃勃的专业人士们,你们…

PyEcharts快速上手_Python数据分析与可视化

PyEcharts快速上手 导入图表类型添加数据设置图表样式输出图表链式调用 导入图表类型 和其他库的导入方法一样,在绘图之前首先要在文件开头导入所需图表类型。 from pyecharts.charts import BarBar 类型是柱状图/条形图在 pyEcharts 中的英文名。 pyEcharts 中有…

vr工业制造流程3D模拟仿真可视化展示

工业仿真3D数字化展示系统具有多方面的独特之处,主要体现在以下几个方面: 1、真实感和交互性:该系统可以将实际的工业设备、产品、场景等进行数字化建模,通过三维图形技术将其呈现在计算机屏幕上,使用户可以在虚拟环境…

Python中的并发编程

目录 一、引言 二、Python中的线程 1、线程的概念 2、创建线程 3、线程同步和锁 4、线程池 三、Python中的进程 1、进程的概念 2、创建进程 四、Python中的异步IO 1、异步IO的概念 2、异步IO的实现 3、异步IO的并发执行 五、总结 一、引言 并发编程是一种计算机…

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…

100W用户、8000W流量在线贺卡应用架构如何优化?

文章目录 🔊博主介绍🥤本文内容📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

数据管理系统-week10-自由访问控制

文章目录 前言一、用户管理用户管理语句介绍二、数据库管理三、特权(重点考点)Administrative (global) privileges数据库特权表权限列权限四、角色参考文献前言 这节课主要讲了用户管理数据库的具体语句,数据库特权当中的全局特权,数据库特权,表特权与列特权的使用与注意…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

KubeShark: Kubernetes的Wireshark

Wireshark可以帮助我们抓取并分析网络数据包,理解网络中发生的事情,那是否有工具可以帮助我们理解在K8S集群中发生的事情,帮助排查集群故障,Kubeshark就是这样的工具。原文: KubeShark: Wireshark for Kubernetes[1] 简介 Wiresha…

【动态代理详解】

动态代理 知道什么是动态代理以及动态代理能干什么就可以 代理的概述 什么是动态代理 ​ 使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理&…

GnuCash macos 设置中文的方法

一、环境: macos 13.6.1 gnucash 5.4-2 二、查看系统默认语言: defaults read -g AppleLocale 三、设置gnucash应用语言: defaults write $(mdls -name kMDItemCFBundleIdentifier -raw /Applications/GnuCash.app) AppleLanguages "…

【Oracle】数据库登陆错误:ORA-28000:the account is locked解决方法

问题描述 在连接Oracle数据库的时候出现了ORA-28000:the account is locked报错,登录账号被锁定,出现这种情况就需要将被锁定用户解锁。 解决方法 解锁方法就是通过用system账号登录数据库,然后修改被锁定账户状态,具体如下图所示…

LINQ-123 题外篇之IEnumerable和IQueryable

这两天又学习了2篇&#xff0c;记录下&#xff1a; IEnumerable and IQueryable in C# - Dot Net Tutorials Differences Between IEnumerable and IQueryable in C# - Dot Net Tutorials 实现接口IEnumerable和IQueryable是使用LINQ查询的必要条件。 关于 IEnumerable<…

51爱心流水灯32灯炫酷代码

源代码摘自远眺883的文章&#xff0c;大佬是30个灯的&#xff0c;感兴趣的铁汁们可以去看看哦~&#xff08;已取得原作者的许可&#xff09;&#xff1a;基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡&#xff…

SSM+VUE的增删改查

目录 后端代码 mapper.xml controller 前端代码 api》action.js 后端代码 mapper.xml <!--模糊查询--><select id"selectLike" parameterType"com.zking.spboot.model.Book" resultMap"BaseResultMap">select * from t_book&l…

selenium+python

selenium 八大查找元素 from selenium import webdriver from selenium.webdriver.common.by import By# 创建一个 WebDriver 实例 driver webdriver.Chrome()# 打开网页 driver.get("https://www.baidu.com/")# 使用 find_element 方法查找元素 element driver.…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

prometheus部署及与grafana结合应用

一、prometheus 介绍 prometheus server 是 Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。它会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&#xff0c;当新拉取到的数据大于配置的内存缓存区时&…