asyncawait函数

news2024/12/26 22:09:15

一种更简洁的方式写出基于Promise的异步行为

async函数的返回值为一个promise,通过then和catch来捕获内部的返回值

1.特性:

1. async函数内部会返回一个promise对象,如果看起来不是promise,那么它将会隐式的包装在promise中(如果代码里返回的不是promise对象,会将其包装成promise对象

async function fn () {
  return 'hello world' 
}

 

2. await能获取到promise状态改变后的值,如果后面不是一个promise,await 会把该值转换为已正常处理的Promise,结果为undefined

async function fn () {
  await 1 
}

 

3. await后面promise的状态是reject,则await后的代码不会执行,async函数将返回状态为reject的promise

    async function fn() {
      await cosle.log("sdf");
      console.log(111);
      
    }
    console.log(fn());

4. async函数内部如果存在await,await表达式会暂停整个async函数的执行,等当前位置promise状态改变后才能恢复

2.面试题分析:

    async function fn() {
      setTimeout(function () {
        console.log(1)
      }, 0)
      Promise.resolve().then(() => console.log(4))
      await setTimeout(function () {
        console.log(5)
      }, 0)
      await Promise.resolve().then(() => console.log(6))
      Promise.resolve().then(() => console.log(7))
      console.log(3)
    }

    fn()

    //4 6 3 7 1 5

    分析:

宏任务:setTimeout 1;setTimeout 5

    微任务: 4 6--》7

    1.setTimeout 1会放在宏任务中

    2.Promise.resolve().then(() => console.log(4))会放在微任务中

    3.await setTimeout(function () {

        console.log(5)

      }, 0)

      await后面跟的不是promise对象,会将其转为promise对象,并返回undefined

      所以这段代码等价于:

      await Promise.resolve(setTimeout(function(){ console.log(5) },0) 此时有个定时器,所以会放入宏任务中

    4. await Promise.resolve().then(() => console.log(6)) 执行后会将then后面放入微任务中,

    ***到此同步代码执行完(因为await会等待结果输出后再执行下面代码,所以下面的都不开始执行,而这个微任务在微任务4后面,所以需要先执行4,即打印4,6,

     打印完后,await当前结果输出继续往下,将7设置进微任务

    5.Promise.resolve().then(() => console.log(7))放入微任务中

    6. 打印console.log(3)

    打印完3以后重新执行微任务7,在执行宏任务 1,5

 最后为4,6,3,7,1,5

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

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

相关文章

保姆级VitrualBox下载ubantu

首先先到此处下载VitrualBox选择对应的配置 Oracle VM VirtualBox 下载VitrualBox的同时要下载一个Visual,支持VitrualBox运行 最新受支持的 Visual C 可再发行程序包下载 | Microsoft Learn 同时再根据下面的网址去下载Ubantu 下载好后桌面出现这两个&#xff0c…

从培训班出来之后找工作的经历,教会了我五件事.....

我是非计算机专业,由于专业不好实习急着就业有过一些失败的工作经历后,跑去参加培训进入IT这行的。 之前在报名学习软件测试之前我也很纠结,不知道怎么选择机构。后面看到有同学在知乎上分享自己的学习经历,当时对我的帮助很大。…

从手动操作到自动化管理,如何实现企业身份业务全面自动化?

在数字化时代,身份管理已经成为了企业和组织不可或缺的一部分,企业对于管理员工、客户和合作伙伴的身份信息和访问权限的需求变得愈发复杂。身份管理不仅仅是一项必要的任务,更是确保业务流畅运营和数据安全的关键因素。然而,传统…

Restful 风格

目录 Restful风格创建springboot项目SpringMVC开发Restful接口1、获取所有的员工思路代码RequestMappingGetMapping 2、获取单个员工思路代码注意: 3、删除员工数据思路:代码单个删除批量删除 4、更新员工数据思路: 5、jQuery发送请求发送del…

应该继续学习编程,还是学数控?

今日话题,继续学习编程,还是学数控?综合来说肯定是软件的待遇和工作环境都要好些。 当然这行有一定的技术门槛,所谓会者不难,难者不会。要入门需要一定的天赋或者说时间,当然 兴趣是最好的老师,…

【密评】商用密码应用安全性评估从业人员考核题库(九)

商用密码应用安全性评估从业人员考核题库(九) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 2001 判断题 在GM/T 0022《IPSec VPN技术规范》中定义了 OSI七层网络…

微信小程序通过webview嵌入的h5 ,遇到打开pdf网址需求的解决办法

h5中,后端给到我一个地址假设为: https://tj-data-bak-to-test228.oss-cn-hanu.aliyunm/us/pdfs/glu_report/xxxxxx99391.pdf 然后需要自己写个pc页面,里面通过iframe引入这个pdf地址,然后将这个pc页面,通过webview嵌…

python项目之医用耗材网上申领系统(django)

项目简介 医用耗材网上申领系统实现了以下功能: 管理员功能:登录,耗材申领,日志管理,申领管理,系统设计,耗材管理。用户:日志管理,耗材申领,申领管理&#…

【EI会议征稿】第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)

第三届大数据、信息与计算机网络国际学术会议(BDICN 2024) 2024 3rd International Conference on Big Data, Information and Computer Network 第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)定于2024年1月12-14日在…

外汇天眼:澳大利亚拟规范数字资产中介与交易所!

澳大利亚政府,通过财政部,宣布正在努力引入一项监管框架,针对为澳大利亚居民和澳大利亚企业提供数字资产访问和持有服务的实体,将包括对所有数字资产中介的许可要求。 这些改革旨在解决已经确定的消费者风险,并支持数…

KNN算法 c++实现

来源【机器学习实战之一】:C实现K-近邻算法KNN_两个图像的特征向量应用knn模型进行匹配-CSDN博客 //计算每个训练数据到待分类元组的距离,取和待分类元组距离最近的k个训练数据,k个数据中哪个类别的训练数据占多数,则待分类元组就…

ewebeditor编辑器漏洞

原理 网页在线编辑器,权限限制不严格,弱口令,文件过滤出现问题 特征 在网址上面加ewebeditor 防御 1、及时更新网站的软件和插件,漏洞及时修补 2、加强网站的访问控制,限制未经授权的访问和操作 3、加强对网站数据…

NFTScan 支持非 EVM 公链的 NFT Collection 的认证功能

截止到 2023 年 10 月份,NFTScan 已经支持了 18 条区块链网络,其中有 14 条 是 EVM 兼容的区块链网络: Ethereum、BNBChain、Polygon、zkSync、Base、Linea、Arbitrum、Optimism、Avalanche、Fantom、PlatON、Cronos、Gnosis、Moonbeam。 另…

快速实现MQTT协议网关网口连接西门子PLC

MQTT协议网关网口连接西门子SMART200PLC操作说明v1.3 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器 三. MQTT网关登陆平台配置步骤 3.1 登录 3.2 网关概况 3.3 MQTT连…

JVM(Java Virtual Machine)内存模型篇

前言 本文是JVM系列的内存模型篇,参考资料为《深入理解Java虚拟机》,本文章将会以HotSpot 虚拟机为介绍基础。 1.JVM简单介绍 Java Virtual Machine是运行Java程序的基础,JVM基于C、C实现,JVM有很多种类,但是这些虚…

idea 里 没有svn选项的处理办法

总结一下没有svn选项的几种情况: 情况1:IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Control Integration,在打开的窗口…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像,需要自己通过Dockerfile打包镜像,其实这也是为了开发者考虑,比如一些个性化功能,如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…

【软考-中级】系统集成项目管理工程师 【17 信息系统安全管理】

持续更新。。。。。。。。。。。。。。。 【第十七章】信息系统安全管理 (选择2分 17.1 信息安全管理17.1.1 信息安全含义和目标 17.2 信息系统安全17.2.1信息系统安全概念17.2.2信息系统安全属性17.2.3信息系统安全管理体系 17.3 物理安全管理17.3.1计算机机房与设施安全17.3.…

Postman入门基础 —— 接口测试流程!

一、编写接口测试计划 接口测试计划和功能测试计划目标一致,都是为了确认需求、确定测试环境、确定测试方法,为设计测试用例做准备,初步制定接口测试进度方案。一般来说,接口测试计划包括概述、测试资源、测试功能、测试重点、测…

【C++】用constexpr,constinit,consteval让程序跑的快一点

从C11加入constexpr关键字开始,到C20又加入了consteval ,constinit ,有3个const打头的关键字 虽然是以const开头的,不过这3个关键字主要是指示在编译时候的动作,它们都是在编译时就已经被编译程序处理,并非…