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

  • apple carplay怎么连接手机(applecarplay怎么看视频)

    apple carplay怎么连接手机(applecarplay怎么看视频)

  • 曲靖微信扫码乘车怎么使用(丽江微信乘车码)

    曲靖微信扫码乘车怎么使用(丽江微信乘车码)

  • 怎么把平板小键盘变成大键盘(怎么把平板的小键盘换成大的)

    怎么把平板小键盘变成大键盘(怎么把平板的小键盘换成大的)

  • 怎么不让别人看淘宝主页(怎么不让别人看到微信运动步数)

    怎么不让别人看淘宝主页(怎么不让别人看到微信运动步数)

  • 购买记录待处理要多久?(appstore购买记录待处理)

    购买记录待处理要多久?(appstore购买记录待处理)

  • 飞行模式还能查出手机轨迹吗(飞行模式还能查到行程码吗)

    飞行模式还能查出手机轨迹吗(飞行模式还能查到行程码吗)

  • 华硕笔记本一开机就reboot(华硕笔记本一开机就关机)

    华硕笔记本一开机就reboot(华硕笔记本一开机就关机)

  • 为什么微信不能扫描二维码(为什么微信不能绑定qq号)

    为什么微信不能扫描二维码(为什么微信不能绑定qq号)

  • 红米note8怎么进入极简桌面(红米note8怎么进入双清)

    红米note8怎么进入极简桌面(红米note8怎么进入双清)

  • 华为mate304g版支持5g吗(华为mate304g版支持隔空操作吗)

    华为mate304g版支持5g吗(华为mate304g版支持隔空操作吗)

  • iphone x发热怎么解决(iphone x 发热)

    iphone x发热怎么解决(iphone x 发热)

  • 华为手机悬浮图标怎么关闭(华为手机悬浮图关闭)

    华为手机悬浮图标怎么关闭(华为手机悬浮图关闭)

  • 苹果手机支持nfc功能吗(苹果手机支持NFC公交卡吗)

    苹果手机支持nfc功能吗(苹果手机支持NFC公交卡吗)

  • 苹果手机数据怎么转移到电脑上(苹果手机数据怎么删除干净)

    苹果手机数据怎么转移到电脑上(苹果手机数据怎么删除干净)

  • 显卡驱动与windows版本不兼容(显卡驱动与windows不兼容怎么办)

    显卡驱动与windows版本不兼容(显卡驱动与windows不兼容怎么办)

  • 小米蓝牙耳机充次电可以用多久(小米蓝牙耳机充电)

    小米蓝牙耳机充次电可以用多久(小米蓝牙耳机充电)

  • 联想m7206用什么粉盒(联想m7206用什么型号粉盒)

    联想m7206用什么粉盒(联想m7206用什么型号粉盒)

  • cad矩形阵列怎么用(cad矩形阵列怎么改变方向)

    cad矩形阵列怎么用(cad矩形阵列怎么改变方向)

  • Win11右键刷新不见了怎么办 Win11右键无刷新功能解决方法(windows右键刷新总是卡住)

    Win11右键刷新不见了怎么办 Win11右键无刷新功能解决方法(windows右键刷新总是卡住)

  • mnyexpr.exe是什么进程 作用是什么 mnyexpr进程查询(msoobe.exe是什么)

    mnyexpr.exe是什么进程 作用是什么 mnyexpr进程查询(msoobe.exe是什么)

  • CCF-CSP真题《202212-2 训练计划》思路+python,c++满分题解(2020ccf csp报名和考试时间)

    CCF-CSP真题《202212-2 训练计划》思路+python,c++满分题解(2020ccf csp报名和考试时间)

  • 利润表主营业务成本怎么算
  • 汽车销售和租赁哪个大
  • 税控服务费抵税
  • 销售人员的福利项目包含什么
  • 所得税筹划的意义
  • 企业存货核算的内容包括
  • 甲公司存货采用实际成本法核算
  • 转让财产收入征税吗
  • 临时员工和正式员工区别
  • 计划成本法委托加工物资例题
  • 低值易耗品计入什么账户
  • 库存金额负数怎么处理
  • 去银行提取备用金开支票怎么填
  • 异地预缴增值税后本地怎么申报
  • 高速公路过路费计入什么会计科目
  • 购进货物既用于应税项目又用于免税项目的
  • 贴现法付息什么意思
  • 外贸企业人民币结算
  • 分公司所得税怎么交
  • 小规模纳税人当月超过500万的部分怎么申报
  • 9万以下免征增值税政策
  • 出售房产收入计入什么科目
  • 钻井采用的主要设备
  • 法定盈余公积是留存收益吗
  • 物业预收停车费不退费
  • 社保基数如何计算单位和个人承担多少
  • mac如何改变用户名
  • mac输入法打不出简体
  • 小规模纳税人无票收入免税吗
  • 如何防止win10自动重启
  • 抵扣农产品进项税时,也要抵扣运费吗
  • 落枕怎么办怎么治疗
  • 个人房屋出租税票怎么开
  • 企业购进废旧厂房税率
  • 应付职工薪酬资产还是负债
  • 羊了不眄翻译
  • uniapp下拉菜单
  • require.context()的用法详解
  • 损益类科目调整影响所得税吗为什么
  • 后端返回图片
  • gpt参数
  • 建筑业增值税怎么算举例说明
  • 销项税大于进项税当月交税吗
  • 帝国cms模板文件放在哪里
  • 发放年终奖的会议纪要
  • 想买微波炉
  • 公司车辆缴纳车船税
  • 职工社会保险费是什么意思
  • 增值税怎么开
  • 公司的旅游费怎么处理
  • 预付账款余额在贷方为
  • 转账支票的特点有哪些
  • 税务入账的加油费怎么算
  • 有哪些不动产
  • 小规模纳税人核定销售额
  • 住宿发票项目有哪些
  • 一件产品在不同场合的价格
  • 单独设置停工损失科目
  • 新准则融资租赁承租人的会计处理
  • sql语句的查询语句
  • XP系统怎么升级win10
  • win8的系统
  • centos7 tcp6
  • eudcedit.exe
  • 用U盘安装系统重启后进不去
  • win10关闭系统服务
  • kmsss.exe是什么
  • linux 使用
  • linux 11
  • nodejs writestream
  • Unity3D游戏开发培训课程大纲
  • 浅谈jQuery中Ajax事件beforesend及各参数含义
  • python最优化
  • python 系统监控
  • 北京比较大五金市场在哪
  • 广东省国家税务总局稽查局局长
  • 办税人员怎么绑定电子税务系统
  • 青岛市税务管理局
  • 兰州税收优惠园在哪
  • 地源热泵有收费标准吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设