终于理清楚了Promise以及async和await

2023-05-16

promise理解:

1,是js异步编程的新的解决方案
2,是一个构造函数
3,用来封装一个异步操作,并可以获得其结果

promise三个状态:

1,pendding 未确定
2,resolved 成功
3,rejected 失败
注:状态只能改变一次,成功数据称为value,失败称为reason

promise的基本使用

在这里插入图片描述

为什么要用Promise:

1.指定回调函数的方式灵活,可以在异步任务前指定也可以在异步任务后指定,而以前指定回调函数必须在异步任务开始前指定。
2.支持链式调用,可以解决回调地狱问题
3.回调地狱:回调函数嵌套调用,内层的回调函数需要的条件是外层异步执行的结果。不便于阅读还有异 常处理,
4.解决方案。promise链式调用。
5.最佳解决方案,async/awai(在程序员角度没有回调函数,编译后其实还是会有回调函数)

语法糖

p3.then(null,reason => {})相当于p3.catch( reason =>{} )
在这里插入图片描述

Promise.all()和Promise.race()

//all方法接收一个数组,数组元素是promise对象
//all方法返回一个Promise对象
const pall = Promise.all([p1,p2,p3])
pall.then(
values =>{},//如果全部执行成功,会返回一个数组,数组元素是三个promise对象resolve的值
reason =>{} //如果有一个失败,会返回失败的promise对象的reject的值
)

//race方法也是接收一个数组,数组元素也是promise对象
//race方法返回一个promise对象
const prace = Promise.race([p1,p2,p3])
prace.then(
value =>{},//第一个执行结束的promise如果是resolved状态,则调用该onResolved函数
reason =>{} //第一个执行结束的promise如果是rejected状态,则调用该onRejected函数
)

promise的几个关键问题

1.改变状态
(1)调用resolve() —>pendding会变成resolved
(2)调用reject() —>pendding会变成rejected
(3)抛出异常 —>pendding会变成rejected
2.指定多个回调函数(也就是多个then)都会调用
//多个then都会执行
p.then(
value=>{},
reason=>{}
)
p.then(
value=>{},
reason=>{}
)
3.(这个问题最重要也是最核心的!!!!!)promise.then()返回的promise的状态由then方法的两个回调函数的执行结果决定:

  1. 无论是onResolved()还是onRejected()执行成功,且没有返回值,那then返回的promise对象的状态就是resolved,value为undefinde。
  2. onResolved()或者onRejected()的返回值是一个非promise值,
    那么then返回的promise的状态就是resolved,且value为return的值
  3. onResolved()或者onRejected()的return是一个promise,
    那这个return的promise的结果就是then返回的promise的结果。
  4. 异常穿透:
    如果then里面的onRejected回调函数没有定义,那么相当于定义了onRejected为
    reason => {throw reason}。所以前面的promise对象如果状态为rejected,
    而且then没有定义onRejected函数,那么reason => {throw reason}就会一直穿透下去
  5. 中断promise链
    catch也会返回一个promise对象
    中断方法:return一个pendding状态的promise对象
    写法:return new Promise(()=>{})
  6. 改变promise和指定回调函数先后问题
    (1)一般情况都是先指定回调函数再改变状态,因为promise执行器函数一般都是封装了异
    步代码,所以会保存两个回调函数onResolved()和onRejected(),最后promise状
    态改变后才决定调用那个回调函数。
    (2)而如果先改变了状态,也就是promise执行器函数封装的是同步代码,那么在会直接
    执行相对应状态的onResolved()和onRejected()
    在这里插入图片描述

async

async用于修饰一个函数,函数的返回值为一个promise对象,该promise对象的状态由函数返回值决定,如果没有返回值并且没有抛出异常,那么相当于:return Promise.resolve(),如果函数抛出异常,则返回的promise对象状态为rejected。

await

1.await右侧的表达式一般为一个promise对象
2.如果修饰的不是promise对象,会返回该值本身
3.如果是promise对象,那么await的返回值是promise对象成功的值
4. 如果promise对象失败了,那么await会抛出这个错误的值 所以await要配合try catch使用 5.await必须写在async函数中,但是async函数可以没有await
6. await会阻塞进程,会暂停当前 async function 的执行,等待 Promise 处理完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终于理清楚了Promise以及async和await 的相关文章

  • 百度云离线下载含有违规内容检测方法分析

    最近国家开始一轮净网行动 xff0c 清除网上的淫秽色情信息 各大互联网厂家纷纷开始行动 xff0c 比如当年很好用的百度云离线下载就一度关闭 后来再次开启后 xff0c 就出现了这句经典词 xff0c 因含有违规内容被屏蔽无法下载 其实被
  • 用python打印购物小票和证书

    目录 1 打印购物小票 2 打印证书 在使用python打印东西时一定要注意到缩进 xff0c 在python语言中对缩进很重视 input用来接收数据 input后边小括号可以写接受数据的条件 在定义常量或者变量名时 xff0c 最好找有
  • prime算法

    prime算法 令无向图 G 61 V E G 61 V E
  • 深度学习二

    BT神经元为按照误 差逆向传播算法训练的多层前馈神经网络 BT神经网络分为输入层 隐藏层 输出层 输入层一般有数据种类多个神经元 xff0c 接受数据 隐藏层的神经元为根号下隐藏层 输出层加b个 xff0c 输入的每个数据加权和返回数之和为
  • Python基础

    一 python代码编译 python 是解释型语 在执 的时候 需要解释器 边解释 翻译 边执 从上到下执 下 代码出现的错误 不会影响上 代码的执 二 python中的三种波浪线 红色波浪线 xff1a 是代码中的错误 需要解决 否则会
  • Word处理控件Aspose.Words功能演示:使用 C# 在 Word 文档中创建和修改 VBA 宏

    Aspose Words 是一种高级Word文档处理API xff0c 用于执行各种文档管理和操作任务 API支持生成 xff0c 修改 xff0c 转换 xff0c 呈现和打印文档 xff0c 而无需在跨平台应用程序中直接使用Micros
  • 建硬盘分区,pvcreate 报:“Can topen /dev/sdb1 exclusivel...?“;磁盘分区报:设备或资源;RHEL本地存储项目二mkfs.vfat报错

    建立硬盘分区 xff0c pvcreate 时报错 xff1a 34 Can topen dev sdb1 exclusively Mounted filesystem 34 dmsetup remove all 清空所有陈旧条目后成功 x
  • 搜索文件内容的几种方式

    搜索文件的几种方式 xff1a 一 提取文件 xff0c 插入数据库text xff0c 使用like 查询 使用poi或PageOffice提取文件内容文字 缺点 xff1a 只适合数据量不大的情况 二 提取文件 xff0c 插入数据库t
  • Centos 7虚拟机ifconfig ens或ip addr时,ens33不显示inet地址

    systemctl stop NetworkManager systemctl disable NetworkManager
  • nodeinternalmodulescjsloader936 throw err; 求解决

    D ethereumDkfuwq gt node app js node internal modules cjs loader 936 throw err Error Cannot find module safe buffer Requ
  • Tomcat 下载安装教程

    文章目录 参考资料1 下载2 安装3 卸载4 启动5 关闭6 配置7 部署8 IDEA使用Tomcat 8 1 集成本地Tomcat8 2 Tomcat Maven插件 参考资料 视频 使用Tomcat的前提是你已经熟练Java xff0c
  • JS说古道今

    JS说古道今 本文概要 讲述js的来源及重要的语法特性 xff0c 包括数据类型 DOM 作用域等 xff08 由于专业性比较强就不写诗扯淡了 61 61 xff0c 我尽量写的有趣点吧 JS JSP xff1f JavaScript xf
  • 删除集合当中的空元素(Collections.singleton(null)与stream())

    Arrays asList创建的数据为定长集合 xff0c 集合长度在操作时是不可以改变的 xff0c 不能对集合进行增删操作 Collections singleton null 相关 span class token comment 反
  • RabbitMQ配置更改TCP默认端口5672

    前言 公司新项目需集成RabbitMQ xff0c 但服务器环境已经安装了ActiveMQ 今天同事不说还不知道 xff0c 导致安装后俩MQ打架 端口冲突 而发生的一系列问题 没办法 xff0c 后来居上的就很被动 xff0c 于是就得改
  • WebSocket服务端消息推送

    前言 xff1a 移动互联网蓬勃发展的今天 xff0c 大部分手机 APP和网站都提供了消息推送功能 xff0c 如新闻客户端的热点新闻推荐 xff0c IM 工具的聊天消息提醒 xff0c 电商产品促销信息 xff0c 企业应用的通知和审
  • tomcat7下载

    百度网盘下载 xff1a 链接 xff1a https pan baidu com s 1qbaxHo0dEdL9JC08yzbL6Q 提取码 xff1a ysz9
  • Springboot查看日志

    Springboot查看日志 以前用springMVC时查看日志直接进入tail f out 但是用了springboot之后 xff0c 一时不知道如何实现 xff0c 记录一下 以下以log4j2为日志框架 先在log4j2 xml中添
  • 爬取CSDN专栏文章到本地,并保存为html、pdf、md格式

    前言 突然想爬取CSDN的专栏文章到本地保存了 xff0c 为了影响小一点 xff0c 特地挑选CSDN的首页进行展示 综合资讯这一测试点是什么找到的呢 xff1f 就是点击下图的热点文章 xff0c 然后跳转到具体文章 xff0c 然后再
  • Spring入门第一讲——Spring框架的快速入门

    Spring的概述 什么是Spring xff1f 我们可以从度娘上看到这样有关Spring的介绍 xff1a 说得更加详细一点 xff0c Spring是一个开源框架 xff0c Spring是于2003年兴起的一个轻量级的Java开发框
  • 手动清理RabbitMq队列中的消息

    一 手动删除队列中指定个数的消息 打开RabbitMq管理页面 xff0c 进入队列 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 二 一次清理队列中的所有消息 打开R

随机推荐