位置: IT常识 - 正文

异步函数async(异步函数执行顺序)

编辑:rootadmin
异步函数async 什么是同步异步

推荐整理分享异步函数async(异步函数执行顺序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:异步函数同步执行,异步函数中需要等数据获取完,wx.navigateTo才跳转,异步函数同步执行,异步函数同步执行,异步函数是什么意思,异步函数有哪些,异步函数的作用,异步函数和同步函数,内容如对您有帮助,希望把文章链接给更多的朋友!

在最新的ES7(ES2017)中提出的前端异步特性:async、await。 在了解async和await之前得先明白什么是同步函数,什么是异步函数。

同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事情全都做完了才返回。比如说在银行排队办理业务,要等到前面一个人办完才能到下一个。异步函数:如果一个异步函数被调用时,该函数会立即返回尽管该函数规定的操作任务还没有完成。比如一个人边吃饭,边看手机,边说话,就是异步处理的方式。async

async从字面意思上很好理解,是异步的意思,async用于申明一个function是异步的,函数返回的是一个promise。

async作为关键字放到函数前面,用于表示函数是一个异步函数。该函数的执行不会阻塞后面代码的执行。async函数返回的是一个promise对象,可以调用then方法获取到promise的结果值。async function f() { return 1; } f().then((res) => { console.log(res) }) //1

async函数会返回一个promise对象,如果function中返回的是一个值,async直接会用Promise.resolve()包裹一下返回。

await

await有等待的意思,等待一个异步方法执行完成。

await关键字只能放async函数里面。 而async函数里不是必须有await。await关键字的返回结果就是其后 promise执行的结果值,是resolved或者 rejected后的值。function getSomething() { return "something"; } async function testAsync() { return Promise.resolve("hello async"); } async function test() { const v1 = await getSomething(); const v2 = await testAsync(); console.log(v1, v2); } test(); // something hello async 为什么await关键词只能在async函数中用

await操作符等的是一个返回的结果,那么如果是同步的情况,那就直接返回了。

那如果是异步的情况呢,异步的情况下,await会阻塞整一个流程,直到结果返回之后,才会继续下面的代码。

阻塞代码是一个很可怕的事情,而async函数,会被包在一个promise中,异步去执行。所以await只能在async函数中使用,如果在正常程序中使用,会造成整个程序阻塞,得不偿失。

async/await异步函数async(异步函数执行顺序)

异步代码就像写同步代码一样,也避免了回调地狱。

串行:等待前面一个await执行后接着执行下一个await,以此类推async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); })}const serialFn = async () => { //串行执行 console.log(await asyncAwaitFn('string 1')); console.log(await asyncAwaitFn('string 2')); console.timeEnd('serialFn ')}serialFn();

并行:将多个promise直接发起请求(先执行async所在函数),然后再进行await操作async function asyncAwaitFn(str) { return await new Promise((resolve, reject) => { setTimeout(() => { resolve(str) }, 1000); })}const parallel = async () => { //并行执行 const parallelOne = asyncAwaitFn('string 1'); const parallelTwo = asyncAwaitFn('string 2') //直接打印 console.log(await parallelOne) console.log(await parallelTwo) console.timeEnd('parallel')}parallel()

async、await错误处理

在Promise中当请求reject的时候我们可以使用catch。为了保持代码的健壮性使用async、await的时候我们使用try catch来处理错误。

async function catchErr() {try {const errRes = await new Promise((resolve, reject) => {setTimeout(() => {reject("http error...");}, 1000););//平常我们也可以在await请求成功后通过判断当前status是不是200来判断请求是否成功// console.log(errRes.status, errRes.statusText); } catch(err) { console.log(err); }}catchErr(); //http error...

虽然async、await也使用到了Promise但是却减少了Promise的then处理使得整个异步请求代码清爽了许多。

前面扯了这么多,也是时候回到正题了,我们先来看下面的一个例子。 我们需要做一个功能,在页面加载的时候实现查询三组数据:查询用户、查询朋友、查询图片。

class Api { constructor () { this.user = { id: 1, name: 'test' } this.friends = [ this.user, this.user, this.user ] this.photo = 'not a real photo' } getUser () { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.user), 200) }) } getFriends (userId) { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.friends.slice()), 200) }) } getPhoto (userId) { return new Promise((resolve, reject) => { setTimeout(() => resolve(this.photo), 200) }) } throwError () { return new Promise((resolve, reject) => { setTimeout(() => reject(new Error('Intentional Error')), 200) }) }}

在上面定义了API的类,里面写了三个封装的查询接口。现在要依次执行那三个操作。 第一种方法:Promises的嵌套:

function callbackHell () { const api = new Api() let user, friends api.getUser().then(function (returnedUser) { user = returnedUser api.getFriends(user.id).then(function (returnedFriends) { friends = returnedFriends api.getPhoto(user.id).then(function (photo) { console.log('callbackHell', { user, friends, photo }) }) }) })}

从上面可以看出,这代码块很简单,但它有很长、很深的嵌套。

这只是简单的函数内容,但在真实的代码库中,每个回调函数可能会很长的代码,这就可能会导致代码变得庞大难读懂。处理此类代码,在回调内的回调中使用回调,通常称为“回调地狱”。

更糟糕的是,没有错误检查,因此任何回调都可能作为未处理的resove/reject而失败。 第二种方法:Promises链:

function promiseChain () { const api = new Api() let user, friends api.getUser() .then((returnedUser) => { user = returnedUser return api.getFriends(user.id) }) .then((returnedFriends) => { friends = returnedFriends return api.getPhoto(user.id) }) .then((photo) => { console.log('promiseChain', { user, friends, photo }) })}

Promises的一个不错的功能是,可以通过在每个回调中返回另一个Promises来链接它们。这样,我们可以将所有回调保持在相同的缩进级别。我们还可以使用箭头函数来简化回调函数的

本文链接地址:https://www.jiuchutong.com/zhishi/298721.html 转载请保留说明!

上一篇:2022前端面经---改变this指向问题(call、apply、bind)(2021年前端面试)

下一篇:【Vue3】如何创建Vue3项目及组合式API(创建vue3项目的步骤)

  • 怎么共享打印机到电脑上(怎么共享打印机)(怎么共享打印机给旁边的电脑连)

    怎么共享打印机到电脑上(怎么共享打印机)(怎么共享打印机给旁边的电脑连)

  • 手机爱奇艺会员和电视奇异果通用吗(手机爱奇艺会员怎么在电脑上登录)

    手机爱奇艺会员和电视奇异果通用吗(手机爱奇艺会员怎么在电脑上登录)

  • 安装系统找不到任何设备驱动程序(安装系统找不到kernel32)

    安装系统找不到任何设备驱动程序(安装系统找不到kernel32)

  • 设置群待办是什么意思(群里设置群待办啥意思)

    设置群待办是什么意思(群里设置群待办啥意思)

  • 华为hg8310m最大带宽(华为hg8310m是否支持200m宽带)

    华为hg8310m最大带宽(华为hg8310m是否支持200m宽带)

  • 苹果11可以更新13.5系统吗(苹果11可以更新16.1.2系统吗)

    苹果11可以更新13.5系统吗(苹果11可以更新16.1.2系统吗)

  • 显卡温度过高会出现什么现象(显卡温度过高会黑屏吗)

    显卡温度过高会出现什么现象(显卡温度过高会黑屏吗)

  • 苹果两网和三网有什么区别(苹果两网三网是什么意思)

    苹果两网和三网有什么区别(苹果两网三网是什么意思)

  • 哪个模块能观察出硬盘使用过的时间和次数(哪个模块能观察出硬盘使用过的时间)

    哪个模块能观察出硬盘使用过的时间和次数(哪个模块能观察出硬盘使用过的时间)

  • 手机微信直播咋录屏(在微信里直播)

    手机微信直播咋录屏(在微信里直播)

  • 电脑进水会自动关机保护(电脑进水会自动修复吗)

    电脑进水会自动关机保护(电脑进水会自动修复吗)

  • 淘宝买不了东西是怎么回事(淘宝买不了东西显示活动火爆)

    淘宝买不了东西是怎么回事(淘宝买不了东西显示活动火爆)

  • 电脑的除法键是哪个(电脑键盘上除法键是哪个)

    电脑的除法键是哪个(电脑键盘上除法键是哪个)

  • 微信文件保存几天(微信文件保存几天失效)

    微信文件保存几天(微信文件保存几天失效)

  • 陌陌对方账号存在异常是为什么(陌陌对方账号存在异常能收到信息吗)

    陌陌对方账号存在异常是为什么(陌陌对方账号存在异常能收到信息吗)

  • 淘宝账号被降权是什么意思(淘宝账号被降权是怎么回事)

    淘宝账号被降权是什么意思(淘宝账号被降权是怎么回事)

  • 显示器下面5个按钮(显示器下面5个按钮,关机状态下按的有用吗)

    显示器下面5个按钮(显示器下面5个按钮,关机状态下按的有用吗)

  • 苹果7相机声音怎么关(苹果7相机声音怎么开启)

    苹果7相机声音怎么关(苹果7相机声音怎么开启)

  • 怎么用光盘重装系统win7(怎么用光盘重装系统的步骤教程)

    怎么用光盘重装系统win7(怎么用光盘重装系统的步骤教程)

  • 抖音怎么上架商品(抖音怎么上架商品橱窗多个链接)

    抖音怎么上架商品(抖音怎么上架商品橱窗多个链接)

  • 考驾照手机号被占用怎么办(考驾照电话号码被注册了怎么办)

    考驾照手机号被占用怎么办(考驾照电话号码被注册了怎么办)

  • 车载usb如何连接手机(车载usb如何连接音响)

    车载usb如何连接手机(车载usb如何连接音响)

  • 怎么把a3复印成a4(如何将a3复印成a4纸)

    怎么把a3复印成a4(如何将a3复印成a4纸)

  • 巴黎的先贤祠,法国 (© manjik/Shutterstock)(巴黎拉丁区有个著名的人文景点叫做先贤祠)

    巴黎的先贤祠,法国 (© manjik/Shutterstock)(巴黎拉丁区有个著名的人文景点叫做先贤祠)

  • 捐赠支出增值税
  • 进项税额可以不转出吗
  • 汇算清缴现金流量表怎么填
  • 银行付款回单怎么看
  • 联营企业股利收入
  • 个体户没有营业执照怎么举报
  • 销项进项怎么转化
  • 第三方付款会计分录
  • 发票代表收据吗
  • 固定资产丢失收据怎么写
  • 异地交纳的五险一金可以在个人所得税扣除吗?
  • 城市建设维护税怎么计算
  • 定期定额个体工商户个人所得税
  • 发票章盖住备注烂备注的日期,看不清
  • 合并报表的收入
  • 企业购入存货分录
  • 企业购买自行车记账什么科目
  • 银行承兑汇票没有提示付款
  • 临时股东大会的召开情形
  • 股份支付的成本费用可否税前扣除?
  • 未分配利润可以用来干什么
  • 作废的凭证不能恢复吗
  • 发行股票的手续费、佣金如何会计处理?
  • 银行公户转账需要带什么
  • 差旅费报销会计凭证
  • 购进商品发生溢余的核算
  • php如何上传1个g以上的文件
  • php运用的技术php开发有哪些实用的技术
  • 旧房屋转卖的协议怎么写
  • 物业费可以分期付款吗
  • springboot -d
  • 人工智能 深度
  • crontab命令用法
  • zenity命令 显示图形框
  • ftp port命令
  • laravel后端
  • 金蝶软件做帐流程
  • 认缴制和实缴制的区别
  • 端午节要给钱吗
  • 2.MyBatis
  • wp留言板插件
  • 不发工资可以先报警吗
  • 海关进口增值税专用缴款书如何抵扣
  • 新会计准则里的机械作业是什么
  • 增值税发票扩版申请说明
  • sql2000日志清理
  • 个体工商户是否属于企业
  • 出票后定期付款的汇票,其提示付款的期限为
  • 疫情期间社保减免优惠政策几个月
  • 收到微信公众号反诈骗风险提示
  • 计提员工工资是什么意思
  • 什么是资金结存,它具体包括哪些内容
  • 公司与公司之间的借款合法吗
  • 财务费用的内容包括哪些
  • 开发票的其他要求是?
  • 如何提取工会经费的钱
  • 废品损失如何处理
  • mysql exists与not exists实例详解
  • mysql基本sql语句大全(基础用语篇)
  • mysql存文章的字段设置为多大?
  • navicat 导入
  • 什么是分表分库
  • 远程桌面 登录
  • imac固态
  • mac怎么f9
  • 在windows 7中任务栏儿
  • win7系统更新怎么关闭
  • Extjs ajax同步请求时post方式参数发送方式
  • perl -pi
  • bootstrap基础
  • css实现放大缩小的动画效果
  • linux 定时任务
  • vuex详细教程
  • 下列关于javascript的叙述正确的有
  • jquery对象与dom对象可以相互转换
  • 河北省国家税务局电子税务局官网入口
  • 人工成本占企业利润比例
  • 停车场收费需要什么手续
  • 年报基础数据怎么查
  • 城市维护建设税减半征收政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设