当前位置: 首页 > news >正文

async 和 await(详解)

一、async 和 await

  • promise使用.then链式调用,但也是基于回调函数
  • async/await更加优雅的异步编程的写法
    1.它是消灭异步回调的终极武器
    2.它是同步语法,也就是用同步的写法写异步的代码

案例1:promise异步加载图片

  • 分别使用 .then 和 await 来获取结果
  • 区别
    1.await 完全没有回调函数
    2.await 是同步写法,异步操作
    3.await 后面不仅仅可以接 promise对象,还可以接 async 函数
//里面函数为AJAX,因此是异步任务letloadImg=(url)=>{constp=newPromise((resolve,reject)=>{letnewImg=document.createElement("img")newImg.src=url newImg.onload=function(){resolve(newImg)}newImg.error=function(){reject(newError('Could not load Image at url'))}})returnp}//通过 .then 来获取结果loadImg(url1).then((img)=>{console.log(img.width,img.height)document.body.appendChild(img)returnloadImg(url2)}).then((img)=>{console.log(img.width,img.height)document.body.appendChild(img)}).catch((err)=>{console.log(err)})//使用 async 和 await 的方法来写,立即执行函数(asyncfunction(){// loadImg(url1) 返回 promise 对象// await 可以拿到从 resolve 传递过来的 dom 对象constimg1=awaitloadImg(url1)document.body.appendChild(img1)constimg2=awaitloadImg(url2)document.body.appendChild(img2)})()//await 接 async 函数asyncfunctionloadImg1(){constimg1=awaitloadImg(url1)returnimg1}(asyncfunction(){//img1可以拿到 resolve 里面的值constimg1=awaitimg1 document.body.appendChild(img1)})()

二、async/await 和 promise的关系

  • async/await 是消灭异步回调的终极武器
  • 但和Promise并不排斥,两者相辅相成
  • 执行 async 函数,返回的是 Promsie 对象
  • await 相当于 Promise 的 then ,then指的是成功,不指失败
  • try…catch 可捕获异常,代替了 Promise的 catch

1.async

asyncfunctionfn(){return100}console.log(fn())//返回一个成功态的promise对象,result 是 100fn().then(data=>{console.log(data)})// 100

2.await

  • await 后面接 Promise
    1.await p1相当于是p1.then,并且只是成功态的then
    2.await 和 then 的区别就是:then还需要传回调进去,但 await 可以直接得到值
(asyncfunction(){constp1=Promise.resolve(300)//一个成功态的promise对象,且传了result为300constres=awaitp1// return 值console.log(res)// 300})
  • await 和 .then 的区别
fn().then(data=>{console.log(data)})//await直接通过返回值来接收daita, return dataconstres=awaitfn()
  • await接数值
    1.await后面跟的不是promise对象而是数值时,会自动包装成成功态的promise对象
    2.并且传值给 resolve 为400
(asyncfunction(){constres=await400//Promise.resolve(400)console.log(res)//400})()
  • await接 async 函数
(asyncfunction(){constres=awaitfn()//fn()会返回promise对象,原理一样console.log(res)//400})()
  • await接promise 为空
    1.什么都打印不出来
    2.因为 new Promise 里面没有任何状态改变,而await一直在等待状态改变
    3.只有状态改变了,await才会允许执行后面的代码
(asyncfunction(){constp=newPromise(()=>{})constres=awaitp console.log(res)console.log("success")})()
  • await接 promise 为 error
    1.会出现报错
    2.await相当于成功态的 .then ,都没有成功,因此不会执行后面的代码
    3.因为JS是单线程的
    4.解决:使用 try…catch 偷偷解决掉 error,保证代码运行
    ——捕获到错误就不会影响后面的输出
(asyncfunction(){constp=Promise.reject("error")constres=awaitp console.log(res)console.log("success")})()//什么都打印不出来
(asyncfunction(){constp=Promise.reject("error")try{constres=awaitp console.log(res)}catch(error){console.log(error)}console.log("success")})()//打印出 error 和 success

三、执行顺序

  • 代码中存在 await,则需要等待该行执行完才执行下面的代码
functiontimeout(){returnnewPromise(resolve=>{setTimeout(()=>{console.log(1)resolve()//成功态})})}//情况一asyncfunctionfn(){timeout()console.log(2)}fn()//打印出 2 一秒后 1//情况2asyncfunctionfn(){awaittimeout()console.log(2)}fn()//1秒后打印出 1 2
//写法二functiontimeout(){returnnewPromise(resolve=>{setTimeout(()=>{resolve(1)//成功态,传递参数1})})}asyncfunctionfn(){constres=awaittimeout()//需要一个变量来接收await return的参数console.log(res)console.log(2)}fn()//1秒后打印出 1 2

四、async 和 await 的实质

  • Promise一般用来解决层层嵌套的回调函数
  • async/await 是消灭异步回调的终极武器
  • JS还是单线程,还是得有异步,还是得基于 event loop(轮询机制)
  • async/await 只是一个语法糖

案例2 :请求多份数据,但后一份数据的请求必须依赖上一份数据的请求结果

  • 解决:
    1.可以使用promise的.then 链式层层调用
    2.也可以使用 async/await ,用同步的代码来解决异步问题
    ——依次获取数据,完全是同步的写法
    ——await会等待该行代码完全运行,才执行后面的代码
asyncfunctiongetDate(){constres1=awaitrequest("./a.json")console.log(res1)constres1=awaitrequest("./b.json")console.log(res2)constres1=awaitrequest("./c.json")console.log(res3)}
http://www.jsqmd.com/news/1235614/

相关文章:

  • 内网渗透测试报告生成:Pentestly多格式输出与漏洞管理方案
  • REPENTOGON终极指南:5分钟安装《以撒的结合》最强脚本扩展器
  • TiDB In Action开源社区全解析:贡献指南与生态系统探索
  • 变频器的技术应用:接线与基本参数设置
  • 多协议网络服务端:CetNetworkServer 设计笔记
  • 青岛奢侈品回收去哪里价格高?30 年老牌易奢福,全青岛实体门店一站式高价变现 - 易奢福
  • 如何快速搭建Calculator项目:基于Java 11的完整安装教程 [特殊字符]
  • 实验室的“可重复性”不只来自实验台,也来自采购单
  • 重庆钻石回收迎来变现热潮:全国直营连锁品牌携千名中检鉴定师,添价收全城双店同步国际裸钻流通价 - 二奢分享官
  • SteamGridDB与IGDB API密钥配置教程:解锁高清游戏封面资源
  • AI文献综述工具:智能导航与学术写作革命
  • C++的一些关键字和oneMKL库的安装
  • BilibiliDown完全指南:开源B站视频下载器的5大高效技巧
  • C 语言工业级通用组件手写 11:环形 FIFO 缓冲区
  • OSWorld挑战:深入理解GitHub_Trending/ai/ai-agent-book中的操作系统级AI Agent测试
  • R3nzSkin国服换肤工具:5分钟掌握全皮肤免费使用技巧
  • AI竞争力跃迁公式:掌握这7个底层思维模型,3个月甩开90%同行
  • 从零到精通的ArduPilot开源无人机飞控系统完全指南:多平台自动驾驶控制终极解决方案
  • 5分钟掌握Windows DLL注入:Xenos终极使用指南
  • 2026年7月最新卡地亚无锡来福士界维修保养服务电话 - 卡地亚官方售后中心
  • TTS-papers项目详解:如何构建个人语音合成论文库与研究体系
  • 当一个平台不再需要你“学会使用”,它才算真正做好了
  • 9岁学C++来得及吗?信奥路径下机构匹配指南 - 资讯速览
  • Compose 适配 - 自定义主题
  • smsBomb安全测试实战:10个步骤教你进行短信轰炸安全测试
  • Mysql时间分组
  • TILER技术解析:二维平铺内存如何突破嵌入式图像处理的内存墙
  • 从EAGLE schematic到实际运行:Spark Thermostat硬件开发全流程
  • 【小程序毕业设计】基于微信小程序的宿舍日常与防疫管理平台 高校宿舍出入报备与防疫管理小程序(源码+文档+远程调试,全bao定制等)
  • redis持久化RDB与AOF