位置: 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项目的步骤)

  • 动态网页设计网站上线前,你得准备好“虚拟主机”、“域名”、“备案”三套

    动态网页设计网站上线前,你得准备好“虚拟主机”、“域名”、“备案”三套

  • 抖音如何查看自己的评论(抖音如何查看自己访问过的主页)

    抖音如何查看自己的评论(抖音如何查看自己访问过的主页)

  • 极速退款后卖家拒收退货怎么办(极速退款后卖家拒收退货)

    极速退款后卖家拒收退货怎么办(极速退款后卖家拒收退货)

  • 网上可以查到结婚证电子版吗(网上可以查到结案证明吗)

    网上可以查到结婚证电子版吗(网上可以查到结案证明吗)

  • 拼多多退货包运费怎么关闭(拼多多退货包运费是全额吗)

    拼多多退货包运费怎么关闭(拼多多退货包运费是全额吗)

  • 英特尔14nm用了多少年(英特尔14nm芯片是什么年代)

    英特尔14nm用了多少年(英特尔14nm芯片是什么年代)

  • 华为nova5怎么区域截屏(华为nova5怎么看手机型号)

    华为nova5怎么区域截屏(华为nova5怎么看手机型号)

  • 小米12系统什么时候更新(小米12.1.0系统怎么样)

    小米12系统什么时候更新(小米12.1.0系统怎么样)

  • 华为p40和p40pro屏幕尺寸(华为p40pro和p40pro+屏幕)

    华为p40和p40pro屏幕尺寸(华为p40pro和p40pro+屏幕)

  • 淘宝中途可以改地址吗(淘宝中途可以改尺码吗)

    淘宝中途可以改地址吗(淘宝中途可以改尺码吗)

  • 华为p40芯片是几纳米(华为p40的芯片是)

    华为p40芯片是几纳米(华为p40的芯片是)

  • 华为手机不小心把桌面天气删了怎么添加(华为手机不小心卸载的软件怎么找回来)

    华为手机不小心把桌面天气删了怎么添加(华为手机不小心卸载的软件怎么找回来)

  • vivo插上耳机经常弹出小v(vivo插上耳机经常弹出jovi)

    vivo插上耳机经常弹出小v(vivo插上耳机经常弹出jovi)

  • 三星s10上网慢解决方法(三星s10+网络信号不好怎么办)

    三星s10上网慢解决方法(三星s10+网络信号不好怎么办)

  • 抖音小店里的商品规格是什么(抖音小店商城)

    抖音小店里的商品规格是什么(抖音小店商城)

  • i7 8750h属于什么级别(i7 8750h属于什么级别的cpu)

    i7 8750h属于什么级别(i7 8750h属于什么级别的cpu)

  • 为啥电脑用4g热点很慢(用4g开热点给电脑上网怎么样)

    为啥电脑用4g热点很慢(用4g开热点给电脑上网怎么样)

  • 为什么手机充值被退款(为什么手机充值不能充10元)

    为什么手机充值被退款(为什么手机充值不能充10元)

  • 华为不用锁屏键怎么锁屏(华为不用锁屏键关机)

    华为不用锁屏键怎么锁屏(华为不用锁屏键关机)

  • 抖音里的特效在哪里找(抖音里的特效在哪里关闭)

    抖音里的特效在哪里找(抖音里的特效在哪里关闭)

  • vivox21微信铃声怎么改(vivox21微信铃声怎么自定义)

    vivox21微信铃声怎么改(vivox21微信铃声怎么自定义)

  • qq语音自动翻译怎么设置(qq聊天语音自动翻译怎么设置)

    qq语音自动翻译怎么设置(qq聊天语音自动翻译怎么设置)

  • 大陆怎么用linetv(大陆怎么用link)

    大陆怎么用linetv(大陆怎么用link)

  • wps为什么是金山文档(wps为什么是金山文档小程序)

    wps为什么是金山文档(wps为什么是金山文档小程序)

  • 顺序存储结构的存储一定是连续的(顺序存储结构的线性表称为( ))

    顺序存储结构的存储一定是连续的(顺序存储结构的线性表称为( ))

  • window系统 安装 nvm 详细步骤(windows 安装)

    window系统 安装 nvm 详细步骤(windows 安装)

  • 什么是bashMAC OS手动升级Bash的方法(什么是suv汽车)

    什么是bashMAC OS手动升级Bash的方法(什么是suv汽车)

  • Mac应用图标怎么更换?苹果电脑Mac修改应用图标图文教程(mac应用程序图标)

    Mac应用图标怎么更换?苹果电脑Mac修改应用图标图文教程(mac应用程序图标)

  • 所得税税前扣除凭证管理办法
  • 收到退回的以前年度租金怎么处理
  • 增值税专用发票有效期是多长时间
  • 积分换物品是真的吗
  • 2个公司的法人是谁
  • 所得税费按年缴纳?
  • 个体户城市维护建设税减免性质
  • 小规模纳税人超500万后何时认定为一般纳税人
  • 进口增值税可以抵税吗
  • 开出商业承兑汇票到期会计分录
  • 收到银行转来的进账通知单,上月的销货款
  • 没开发票可以确认收入吗?
  • 注销时其他应付款余额怎么账务处理
  • 销售预付卡的成本是什么
  • 怎么填报清算所得税申报表?
  • 贷款损失准备对不良贷款的比率称作
  • 如何查询分公司开户行
  • 公司为什么要员工提供房产证
  • 投资收益会计处理
  • 企业法人股东向个人借款能起诉查封公司财产吗
  • 开加工费的发票该如何抵扣?
  • 燃油税改革了谁的钱包
  • 关于汽车配件的书
  • 哪些人可以享受长护险
  • 出售固定资产未收款账务处理
  • 出售报废电脑要交什么税
  • 美团扣点怎么做凭证
  • 出口公司代理
  • 网上申报城建税及附加怎么操作
  • 工业企业和其他企业经营的对象
  • 出口退税计算方法是免退税吗
  • windows 11预览版
  • 收到外运公司托收海运运费单据1000美元
  • 微软汽车
  • linux监控系统命令
  • 虚拟机vm怎么用
  • 社保挂靠会计处理
  • PHP:preg_last_error()的用法_PCRE正则函数
  • 手机短信是哪一年开始的
  • php的循环
  • 银行本票结算的特点是什么
  • 以银行存款交纳欠缴税金会计分录
  • 企业购入设备涉及的税种
  • 只有发票没有银行怎么办
  • 社保局申报工伤款多久能下
  • vue整合electron
  • 企业所得税税前扣除管理办法2018
  • 厂区地面硬化施工方案
  • 金税四期能监控到公户吗
  • 以前年度损益影响当期损益吗
  • 售后回租服务费开票
  • 未实缴出资的股东退股
  • 工程一般挂靠取得的收入怎么做账?
  • 固定资产出售增值税减按2%征收,附表一,填写
  • 现金支票存根联和正联怎么盖章
  • 贷款转入账号
  • 小企业核算方式选独立核算
  • 资产计提减值如何进行账面记录
  • 个别会计报表和合并会计报表
  • 小规模公司购买汽车如何抵税
  • 试运行收入冲减哪个项目
  • centos7基本环境选哪个
  • win8系统怎么安装微信
  • win8.1怎么关闭更新
  • iis支持什么后端语言
  • Win7系统设置屏保密码
  • win10系统找不到mrt
  • iusb3mon.exe是什么
  • win7安装远程桌面组件
  • node-js
  • unity自动寻路插件
  • jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
  • js从数组中选出最大的三个数
  • js中写html代码
  • jquery.validate使用详解
  • 国税人事部门党建工作(税务局党建部门)
  • 关联企业之间借款的税收处理
  • 陕西省地税稽查局吴爱成
  • 贵州国家税务局陈开平
  • 西安代驾平台有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设